POJ 3792 Area of Polycubes(模拟)
大意:
按顺序给你一堆正方体,如果当前输入的正方体上下左右前后都没有跟之前的正方体有连接,就输出NO,并输出当前是第几个。如多每次输入的正方体跟之前的都有连接,那么最后输出组成的几何体的表面积。
思路:一步一步模拟就行。注意:1.要判一下有重复的输入,如果有重复的输入,要输出NO,并输出第几。。2.注意下标不要向下溢出。
1 #include <stdio.h> 2 #include <algorithm> 3 #include <vector> 4 #include <string.h> 5 #define max(a, b) ((a)>(b)?(a):(b)) 6 using namespace std; 7 8 int T; 9 int n; 10 bool vis[110][110][110]; 11 12 struct node 13 { 14 int x, y, z; 15 } P[1010]; 16 17 void Solve() 18 { 19 scanf("%d", &T); 20 for(int tt = 1; tt <= T; ++tt) 21 { 22 memset(vis, false, sizeof(vis)); 23 scanf("%d", &n); 24 printf("%d ", tt); 25 scanf("%d,%d,%d", &P[1].x, &P[1].y, &P[1].z); 26 P[1].x++; 27 P[1].y++; 28 P[1].z++; 29 vis[P[1].x][P[1].y][P[1].z] = true; 30 bool flag = true; 31 for(int i = 2; i <= n; ++i) 32 { 33 scanf("%d,%d,%d", &P[i].x, &P[i].y, &P[i].z); 34 P[i].x++; 35 P[i].y++; 36 P[i].z++; 37 if(vis[P[i].x][P[i].y][P[i].z] == true) 38 { 39 if(flag) 40 { 41 printf("NO %d\n", i); 42 flag = false; 43 } 44 continue; 45 } 46 vis[P[i].x][P[i].y][P[i].z] = true; 47 if(!(vis[P[i].x-1][P[i].y][P[i].z] || vis[P[i].x+1][P[i].y][P[i].z] || vis[P[i].x][P[i].y-1][P[i].z] || vis[P[i].x][P[i].y+1][P[i].z] || vis[P[i].x][P[i].y][P[i].z-1] || vis[P[i].x][P[i].y][P[i].z+1])) 48 { 49 if(flag) 50 { 51 printf("NO %d\n", i); 52 flag = false; 53 } 54 } 55 } 56 if(flag) 57 { 58 int sum =n*6; 59 for(int i = 1; i <= n; ++i) 60 { 61 if(vis[P[i].x-1][P[i].y][P[i].z]) 62 { 63 sum -= 1; 64 } 65 if(vis[P[i].x+1][P[i].y][P[i].z]) 66 { 67 sum -= 1; 68 } 69 if(vis[P[i].x][P[i].y-1][P[i].z]) 70 { 71 sum -= 1; 72 } 73 if(vis[P[i].x][P[i].y+1][P[i].z]) 74 { 75 sum -= 1; 76 } 77 if(vis[P[i].x][P[i].y][P[i].z-1]) 78 { 79 sum -= 1; 80 } 81 if(vis[P[i].x][P[i].y][P[i].z+1]) 82 { 83 sum -= 1; 84 } 85 } 86 printf("%d\n", sum); 87 } 88 } 89 90 } 91 92 int main() 93 { 94 ///freopen("data.in", "r", stdin); 95 ///freopen("data.out", "w", stdout); 96 Solve(); 97 return 0; 98 }