POJ 3792 Area of Polycubes(模拟)

POJ 3792

大意:

按顺序给你一堆正方体,如果当前输入的正方体上下左右前后都没有跟之前的正方体有连接,就输出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
", 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
", 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
", 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 }
View Code
原文地址:https://www.cnblogs.com/Silence-AC/p/3643847.html