poj 3792 Area of Polycubes (简单模拟)
题意:在三维坐标系中,给定n个立方体的中心坐标,立方体的边长为1,按照输入顺序,后来输入的必须和之前输入的立方体有公共的边。
而且,不能和之前输入的立方体相同。
如果满足条件,输出表面积。如果不满足,输出不符合条件的那一组。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 9 struct node 10 { 11 int x, y, z; 12 }p[110], m; 13 int dx[10] = {0,0,0,0,1,-1}; 14 int dy[10] = {0,1,0,-1,0,0}; 15 int dz[10] = {1,0,-1,0,0,0}; 16 17 int main() 18 { 19 int ca, t, i, j, n, flag, f, k; 20 int area; 21 scanf("%d", &t); 22 for(ca = 1; ca <= t; ca++) 23 { 24 f = 0; 25 scanf("%d", &n); 26 area = 6*n; 27 28 for(i = 1; i <= n; i++) 29 scanf("%d,%d,%d", &p[i].x, &p[i].y, &p[i].z); 30 for(i = 2; i <= n; i++) 31 { 32 flag = 0; 33 for(j = 1; j < i; j++) 34 { 35 if(p[i].x==p[j].x&&p[i].y==p[j].y&&p[i].z==p[j].z) 36 { 37 f = i; 38 break; 39 } 40 for(k = 0; k < 6; k++) 41 { 42 m.x = p[i].x + dx[k]; 43 m.y = p[i].y + dy[k]; 44 m.z = p[i].z + dz[k]; 45 if(m.x==p[j].x&&m.y==p[j].y&&m.z==p[j].z) 46 { 47 flag = 1; 48 area -= 2; 49 } 50 } 51 } 52 if(flag==0) 53 f = i; 54 if(f) 55 break; 56 } 57 if(f==0) 58 printf("%d %d\n", ca, area); 59 else 60 printf("%d NO %d\n", ca, f); 61 } 62 return 0; 63 }