Description
Input
Output
Sample Input
5 XXXXX X---- X--XX X---X XXXXX XXXXX X---- XXXXX X---- XXXXX XXXXX X---X XXXX- X---X XXXXX 3 X-- -X- --X XX- XXX -XX -XX XXX XX- 0
Sample Output
Data set 1: Valid set of patterns Data set 2: Impossible combination
思路:把给出的三个面当三视图,判断它能否组成一个物体。坑点在于给出的每个面都有8种可能情况:旋转,翻转,翻转之后再旋转。
#include <stdio.h> bool a[20][20][20],vis[20][20][20]; char b[8][20][21],c[8][20][21],d[8][20][21]; int n; void search(int x,int y,int z) { vis[x][y][z]=1; if(x+1<n && !vis[x+1][y][z] && a[x+1][y][z]) search(x+1,y,z); if(y+1<n && !vis[x][y+1][z] && a[x][y+1][z]) search(x,y+1,z); if(z+1<n && !vis[x][y][z+1] && a[x][y][z+1]) search(x,y,z+1); if(x-1>=0 && !vis[x-1][y][z] && a[x-1][y][z]) search(x-1,y,z); if(y-1>=0 && !vis[x][y-1][z] && a[x][y-1][z]) search(x,y-1,z); if(z-1>=0 && !vis[x][y][z-1] && a[x][y][z-1]) search(x,y,z-1); } int main() { int i,j,k,flag,ok,cnt=1,count,o,p,q; while(scanf("%d",&n) && n) { for(i=0;i<n;i++) scanf("%s",b[0][i]); for(i=0;i<n;i++) scanf("%s",c[0][i]); for(i=0;i<n;i++) scanf("%s",d[0][i]); for(k=1;k<=3;k++)//考虑各个面的不同情况 { for(i=0;i<n;i++) { for(j=0;j<n;j++) { b[k][i][j]=b[k-1][j][n-1-i]; c[k][i][j]=c[k-1][j][n-1-i]; d[k][i][j]=d[k-1][j][n-1-i]; } } } for(k=4;k<=4;k++)//考虑各个面的不同情况 { for(i=0;i<n;i++) { for(j=0;j<n;j++) { b[4][i][j]=b[0][n-1-i][n-1-j]; c[4][i][j]=c[0][n-1-i][n-1-j]; d[4][i][j]=d[0][n-1-i][n-1-j]; } } } for(k=5;k<=7;k++)//考虑各个面的不同情况 { for(i=0;i<n;i++) { for(j=0;j<n;j++) { b[k][i][j]=b[k-1][j][n-1-i]; c[k][i][j]=c[k-1][j][n-1-i]; d[k][i][j]=d[k-1][j][n-1-i]; } } } ok=0; for(o=0;o<8 && !ok;o++) for(p=0;p<8 && !ok;p++) for(q=0;q<8 && !ok;q++) { for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) a[i][j][k]=vis[i][j][k]=0; for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(k=0;k<n;k++) { if(b[o][i][j]==‘X‘ && c[p][j][k]==‘X‘ && d[q][i][k]==‘X‘) a[i][j][k]=1; } } } ok=1; for(i=0;i<n && ok;i++) { for(j=0;j<n && ok;j++) { if(b[o][i][j]==‘X‘) { flag=0; for(k=0;k<n && ok;k++) { if(a[i][j][k]) { flag=1; break; } } if(!flag) { ok=0; break; } } } } for(j=0;j<n && ok;j++) { for(k=0;k<n && ok;k++) { if(c[p][j][k]==‘X‘) { flag=0; for(i=0;i<n && ok;i++) { if(a[i][j][k]) { flag=1; break; } } if(!flag) { ok=0; break; } } } } for(i=0;i<n && ok;i++) { for(k=0;k<n && ok;k++) { if(d[q][i][k]==‘X‘) { flag=0; for(j=0;j<n && ok;j++) { if(a[i][j][k]) { flag=1; break; } } if(!flag) { ok=0; break; } } } } count=0; for(i=0;i<n && ok;i++) { for(j=0;j<n && ok;j++) { for(k=0;k<n && ok;k++) { if(a[i][j][k] && !vis[i][j][k]) { count++; search(i,j,k); } } } } if(count!=1) ok=0; if(ok) { printf("Data set %d: Valid set of patterns\n",cnt++); break; } } if(!ok) printf("Data set %d: Impossible combination\n",cnt++); } }
原文:http://blog.csdn.net/faithdmc/article/details/18798649