首页 > 代码库 > poj 1099

poj 1099

http://poj.org/problem?id=1099

#include<stdio.h>#include<string.h>#include <iostream>using namespace std;#define N 60int x,y,n;char mat[N][N];struct node{    int num,id;    int hang,lie;} map[N][N];void init(){    int i,j;    memset(mat,0,sizeof(mat));    for(i=1; i<=x; i++) //空格 和 ‘*‘    {        for(j=1; j<=y; j++)        {            if(i==1 || i==x || j==1 || j==y) mat[i][j]=*;            else mat[i][j]= ;        }    }    for(i=2; i<x; i=i+4) //H原子    {        for(j=2; j<y; j=j+4)            mat[i][j]=H;    }    for(i=4; i<x; i=i+4) //H原子    {        for(j=4; j<y; j=j+4)            mat[i][j]=H;    }    for(i=2; i<x; i=i+4) //O原子    {        for(j=4; j<y; j=j+4)            mat[i][j]=O;    }}void putmat(){    int i,j;    for(i=1; i<=x; i++)    {        for(j=1; j<=y; j++)            printf("%c",mat[i][j]);        puts("");    }}int main(){    int i,j,h,g,time=1;    while(scanf("%d",&n),n)    {        if(time>1)puts("");        memset(map,0,sizeof(map));        y=4*n+3, x=4*n-1;//x行数,y列数        for(i=1; i<=n; i++)        {            for(j=1; j<=n; j++)            {                scanf("%d",&map[i][j].num);                map[i][j].id=n*(i-1)+j;                map[i][j].hang=map[i][j].lie=map[i][j].num;                map[i][j].hang+=map[i][j-1].hang;                map[i][j].lie+=map[i-1][j].lie;            }        }        init();        int k=1;        for(i=1; i<=x; i++)        {            for(j=1; j<=y; j++)            {                if(mat[i][j]==O)                {                    int find=0;                    for(h=1; h<=n; h++)                    {                        for(g=1; g<=n; g++)                            if(map[h][g].id==k)                            {                                find=1,k++;                                break;                            }                        if(find)break;                    }                    if(map[h][g].num==1) mat[i][j-1]=-,mat[i][j+1]=-;                    else if(map[h][g].num==-1) mat[i-1][j]=|,mat[i+1][j]=|;                    else if(map[h][g].num==0)                    {                        if(map[h][g].hang==0) mat[i][j-1]=-;                        else if(map[h][g].hang==1) mat[i][j+1]=-;                        if(map[h][g].lie==0) mat[i+1][j]=|;                        else if(map[h][g].lie==1) mat[i-1][j]=|;                    }                }            }        }        printf("Case %d:\n\n",time++);        putmat();    }    return 0;}

找规律:

题目要求输出的图中如果先不管 H-O 键的话,也就是说光看 H 和 O 原子的话,它们的位置是有规律的,H 原子分两种,一种是从点(2,2)开始横,纵坐标分别以 4 递增,另一种是从点(4,4)开始横,纵坐标分别以 4 递增。而 O 原子的个数就是 n*n ,从(2,4)开始,以 4 递增。我们可以先画出一张没有 H-O 键的图来,然后在根据 数字矩阵中的值,给每一个 O 原子加上两个 H-O 键就可以了。

 

最后加上 H-O 键的时候,按 数字矩阵 分3种情况,1 和 -1 时,很好处理,关键是 0 的时候。仔细看题,有这么一句话: ……the sum of each row and column is 1  ……

就是这句了,解题点,根据 数字矩阵 中该行(或列)上 从开始到现在的点的数值和,可以判断,这个 H-O 键的方向:

上下:该列第一行到该行的数值和,0代表 H-O 在这个 O 原子下面,1是上。

左右:该行第一列到该列的数值和,0代表 H-O 在这个 O 原子左面,1是右。

 

poj 1099