【20190621】幻方

这是一道细节理解和处理的题目,我们需要建立坐标系,并且将每个视图中的位置正确转化成坐标系中的位置,注意每个视图是从正方体内部看到的。

为了处理每个位置有哪几种光线,我们可以将三条光线状压为三位二进制数,最后统计即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int n;
 6 // int f[210][210],b[210][210],u[210][210],d[210][210],l[210][210],r[210][210];
 7 int vis[210][210][210],ans;
 8 char now[210];
 9 int main() {
10     while(scanf("%d",&n)!=EOF) {
11         memset(vis,0,sizeof(vis));
12         ans=0; 
13         for(int i=1;i<=n;i++) {       //line of read              //front
14             scanf("%s",now+1);
15             for(int j=1;j<=n;j++)     //row of read
16                 if(now[j]=='#')
17                     for(int k=1;k<=n;k++)    //other
18                         vis[n-j+1][k][n-i+1]|=1;
19         }
20         for(int i=1;i<=n;i++) {                           //back
21             scanf("%s",now+1);
22             for(int j=1;j<=n;j++)
23                 if(now[j]=='#')
24                     for(int k=1;k<=n;k++)
25                         vis[j][k][n-i+1]|=1;
26         }
27         for(int i=1;i<=n;i++) {             //left
28             scanf("%s",now+1);
29             for(int j=1;j<=n;j++)
30                 if(now[j]=='#')
31                     for(int k=1;k<=n;k++)
32                         vis[k][j][n-i+1]|=(1<<1);
33         }
34         for(int i=1;i<=n;i++) {           //right
35             scanf("%s",now+1);
36             for(int j=1;j<=n;j++)
37                 if(now[j]=='#')
38                     for(int k=1;k<=n;k++)
39                         vis[k][n-j+1][n-i+1]|=(1<<1);
40         }
41         for(int i=1;i<=n;i++) {     //up
42             scanf("%s",now+1);
43             for(int j=1;j<=n;j++)
44                 if(now[j]=='#')
45                     for(int k=1;k<=n;k++)
46                         vis[j][i][k]|=(1<<2);
47         }
48         for(int i=1;i<=n;i++) {     //down
49             scanf("%s",now+1);
50             for(int j=1;j<=n;j++)
51                 if(now[j]=='#')
52                     for(int k=1;k<=n;k++)
53                         vis[j][n-i+1][k]|=(1<<2);
54         }
55         for(int i=1;i<=n;i++)
56             for(int j=1;j<=n;j++)
57                 for(int k=1;k<=n;k++)
58                     if(vis[i][j][k]==7) ans++;
59         printf("%d\n",ans); 
60     }
61     return 0;
62 }
AC Code
posted @ 2019-06-21 20:00  AD_shl  阅读(240)  评论(0编辑  收藏  举报