首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。