ZJNU 1535 - 新建的大楼--中高级
因为从俯视图看,输入输出的视角是从右下方看向左上方的
所以左上角的正方体最有可能被其他正方体挡住
立体上,底部的正方体最有可能被顶部的正方体挡住
所以绘图应该从后往前,从下往上绘制
剩下的就是一大堆计算和判断了
采用的是先绘制出规范的图再与输入的图做对比的方式
#include<stdio.h> #include<string.h> int n,m,ar[21][21]; char ori[200][200],bd[200][200],node[6][8]={ "..+---+", "./ /|", "+---+ |", "| | +", "| |/.", "+---+.." }; void dr(int x,int y){ int i,j; for(i=0;i<6;i++) for(j=0;j<7;j++) if(node[i][j]!='.') bd[x+i][y+j]=node[i][j]; } int main(){ int i,j,h=-1,w,x,y; scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%d",&ar[i][j]); getchar(); while(gets(ori[++h])); w=strlen(ori[0]); for(i=0;i<h;i++) memset(bd[i],'.',w); for(i=0;i<n;i++) for(j=0;j<m;j++){ x=h-(4+2*n)+2*i; y=(n-1)*2+4*j-2*i; while(ar[i][j]--){ dr(x,y); x-=3; } } for(i=0;i<h;i++) for(j=0;j<w;j++) if(bd[i][j]!=ori[i][j]){ puts("NO"); return 0; } puts("YES"); return 0; }