点点滴滴”

导航

poj 1099

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

#include<stdio.h>
#include<string.h>
#include <iostream>

using namespace std;
#define N 60

int 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是右。

 

posted on 2014-09-22 20:36  点点滴滴”  阅读(239)  评论(0编辑  收藏  举报