【20190621】幻方
这是一道细节理解和处理的题目,我们需要建立坐标系,并且将每个视图中的位置正确转化成坐标系中的位置,注意每个视图是从正方体内部看到的。
为了处理每个位置有哪几种光线,我们可以将三条光线状压为三位二进制数,最后统计即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }