幻方

  • 题目链接:幻方
  • 如果没有权限看题,请看下图


  • 题目思路:通过读题,发现题目的重点是读入,我们通过自己画一个图来把数据转化成一个三维图形(输入的数据相当于自己站在正方体里面看六个面,要转化为站在外面看六个面),在通过状压的方式记录来自不同方向的激光,最后枚举判断即可。本题的重点难点在于转化图形建模。
  • 附件:可以根据下图来转化。
  • 代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int n;
    // int f[210][210],b[210][210],u[210][210],d[210][210],l[210][210],r[210][210];
    int vis[210][210][210],ans;
    char now[210];
    int main() {
    while(scanf("%d",&n)!=EOF) {
    memset(vis,0,sizeof(vis));
    ans=0;
    for(int i=1;i<=n;i++) { //line of read //front
    scanf("%s",now+1);
    for(int j=1;j<=n;j++) //row of read
    if(now[j]=='#')
    for(int k=1;k<=n;k++) //other
    vis[n-j+1][k][n-i+1]|=1;
    }
    for(int i=1;i<=n;i++) { //back
    scanf("%s",now+1);
    for(int j=1;j<=n;j++)
    if(now[j]=='#')
    for(int k=1;k<=n;k++)
    vis[j][k][n-i+1]|=1;
    }
    for(int i=1;i<=n;i++) { //left
    scanf("%s",now+1);
    for(int j=1;j<=n;j++)
    if(now[j]=='#')
    for(int k=1;k<=n;k++)
    vis[k][j][n-i+1]|=(1<<1);
    }
    for(int i=1;i<=n;i++) { //right
    scanf("%s",now+1);
    for(int j=1;j<=n;j++)
    if(now[j]=='#')
    for(int k=1;k<=n;k++)
    vis[k][n-j+1][n-i+1]|=(1<<1);
    }
    for(int i=1;i<=n;i++) { //up
    scanf("%s",now+1);
    for(int j=1;j<=n;j++)
    if(now[j]=='#')
    for(int k=1;k<=n;k++)
    vis[j][i][k]|=(1<<2);
    }
    for(int i=1;i<=n;i++) { //down
    scanf("%s",now+1);
    for(int j=1;j<=n;j++)
    if(now[j]=='#')
    for(int k=1;k<=n;k++)
    vis[j][n-i+1][k]|=(1<<2);
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    for(int k=1;k<=n;k++)
    if(vis[i][j][k]==7) ans++;
    printf("%d\n",ans);
    }
    return 0;
    }
rp++