zoukankan      html  css  js  c++  java
  • POJ 1096 Space Station Shielding

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 #define sc(x) scanf("%d",&x)
     6 #define CL(x, y) memset(x,y,sizeof(x))
     7 using namespace std;
     8 const int MAX = 66;
     9 int A, B, C, D, i, num;
    10 int used[MAX][MAX][MAX];
    11 int tower[MAX][MAX][MAX];
    12 int Move[6][3]= {{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};
    13 void BFS(int a, int b, int c);
    14 bool check(int x, int y, int z);
    15 struct node
    16 {
    17     int x, y, z;
    18     int time;
    19 };
    20 queue <node> Q;
    21 void BFS();
    22 int main()
    23 {
    24     while(scanf("%d%d%d%d",&A,&B,&C,&D)!=EOF)
    25     {
    26         if(!A && !B && !C && !D) break;
    27         CL(tower, 0);
    28         CL(used, 0);
    29         int temp;
    30         for(i = 0; i < D; i++)
    31         {
    32             sc(temp);
    33             tower[temp%(A*B)%A+1][temp%(A*B)/A+1][temp/(A*B)+1] = 1;//=1是外面包了一层
    34         }
    35         BFS(0, 0, 0);
    36         printf("The number of faces needing shielding is %d.
    ", num);
    37 
    38     }
    39     return 0;
    40 }
    41 void BFS(int a, int b, int c)
    42 {
    43     int xx, yy, zz;
    44     num = 0;
    45     while(!Q.empty())
    46         Q.pop();
    47     node fir, cur, next;
    48     fir.x = a;
    49     fir.y = b;
    50     fir.z = c;
    51     fir.time = 0;
    52     used[a][b][c] = 1;
    53     Q.push(fir);
    54     while(!Q.empty())
    55     {
    56         cur = Q.front();
    57         Q.pop();
    58         for(i = 0; i < 6; i++)
    59         {
    60             xx = cur.x+Move[i][0];
    61             yy = cur.y+Move[i][1];
    62             zz = cur.z+Move[i][2];
    63             if(check(xx, yy, zz))//在范围内 && !used[xx][yy][zz] && )//哥哥,0代表路,请看清题目!tower[xx][yy][zz]
    64             {
    65                 if(!tower[xx][yy][zz])//有路
    66                 {
    67                     if(!used[xx][yy][zz])//没走过
    68                     {
    69                         next.x = xx;
    70                         next.y = yy;
    71                         next.z = zz;
    72                         next.time = cur.time+1;
    73                         used[xx][yy][zz] = 1;
    74                         Q.push(next);
    75                     }
    76                 }
    77                 else
    78                     num++;//反之则加1, 想反了
    79             }
    80         }
    81     }
    82     return ;
    83 }
    84 bool check(int x, int y, int z)
    85 {
    86     if(x>=0 && x<=A+1 && y>=0 && y<=B+1 && z>=0 && z<=C+1)//应该是A+1,肯定是加2
    87         return true;
    88     return false;
    89 }
    View Code

    错在立方体的坐标,但是解题思路也很关键

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <queue>
      5 #define sc(x) scanf("%d",&x)
      6 #define CL(x, y) memset(x,y,sizeof(x))
      7 using namespace std;
      8 const int MAX = 66;
      9 int A, B, C, D, num;
     10 int used[MAX][MAX][MAX];
     11 int tower[MAX][MAX][MAX];
     12 int Move[6][3]= {{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};
     13 bool check(int x, int y, int z);
     14 struct node
     15 {
     16     int x, y, z;
     17 //    int time;
     18 };
     19 void BFS();
     20 queue <node> Q;
     21 node madeQueue(int xx,int yy,int zz)
     22 {
     23     node rear;
     24     rear.x = xx;
     25     rear.y = yy;
     26     rear.z = zz;
     27     return rear;
     28 }
     29 int main()
     30 {
     31     while(scanf("%d%d%d%d",&A,&B,&C,&D)!=EOF)
     32     {
     33         if(!A && !B && !C && !D) break;
     34         CL(tower, 0);
     35         CL(used, 0);
     36         int temp;
     37         for(int j = 0; j < D; j++)
     38         {
     39             sc(temp);
     40             tower[temp%(B*A)%A+1][temp%(B*A)/A+1][temp/(A*B)+1] = 1;//=1是外面包了一层
     41         }
     42         BFS();
     43         cout<<"The number of faces needing shielding is "<< num <<".
    ";
     44     }
     45     return 0;
     46 }
     47 void BFS()
     48 {
     49 //    int xx, yy, zz;
     50     num = 0;
     51 //    node fir, cur, next;
     52 //    fir.x = 0;
     53 //    fir.y = 0;
     54 //    fir.z = 0;
     55 //    fir.time = 0;
     56 //    used[0][0][0] = 1;
     57 //    Q.push(fir);
     58     Q.push(madeQueue(0,0,0));
     59     while(!Q.empty())
     60     {
     61         node cur = Q.front();
     62         Q.pop();
     63 //        for(i = 0; i < 6; i++)
     64 //        {
     65 //            xx = cur.x+Move[i][0];
     66 //            yy = cur.y+Move[i][1];
     67 //            zz = cur.z+Move[i][2];
     68 //            if(check(xx, yy, zz))//在范围内 && !used[xx][yy][zz] && )//哥哥,0代表路,请看清题目!tower[xx][yy][zz]
     69 //            {
     70 //                if(!tower[xx][yy][zz])//有路
     71 //                {
     72 //                    if(!used[xx][yy][zz])//没走过
     73 //                    {
     74 //                        next.x = xx;
     75 //                        next.y = yy;
     76 //                        next.z = zz;
     77 ////                        next.time = cur.time+1;
     78 ////                num++;
     79 //                        used[xx][yy][zz] = 1;
     80 //                        Q.push(next);
     81 //                    }
     82 //                }
     83 //                else
     84 //                    num++;//反之则加1, 想反了
     85 //            }
     86 //        }
     87         if(used[cur.x][cur.y][cur.z])continue;
     88         used[cur.x][cur.y][cur.z] = 1;
     89         if(cur.x>=1)
     90         {
     91             if(!tower[cur.x-1][cur.y][cur.z])
     92             {
     93                 if(!used[cur.x-1][cur.y][cur.z])
     94                 {
     95 //                    next.x = cur.x-1;
     96 //                    next.y = cur.y;
     97 //                    next.z = cur.z;
     98 //                    Q.push(next);
     99                     Q.push(madeQueue(cur.x-1,cur.y,cur.z));
    100                 }
    101             }
    102             else num++;
    103         }//左走一格
    104         if(cur.x<=A)
    105         {
    106             if(!tower[cur.x+1][cur.y][cur.z])
    107             {
    108                 if(!used[cur.x+1][cur.y][cur.z])
    109                 {
    110 //                    next.x = cur.x+1;
    111 //                    next.y = cur.y;
    112 //                    next.z = cur.z;
    113 //                    Q.push(next);
    114                     Q.push(madeQueue(cur.x+1,cur.y,cur.z));
    115                 }
    116             }
    117             else num++;
    118         }//右走一格
    119         if(cur.y>=1)
    120         {
    121             if(!tower[cur.x][cur.y-1][cur.z])
    122             {
    123                 if(!used[cur.x][cur.y-1][cur.z])
    124                 {
    125 //                    next.x = cur.x;
    126 //                    next.y = cur.y-1;
    127 //                    next.z = cur.z;
    128 //                    Q.push(next);
    129                     Q.push(madeQueue(cur.x,cur.y-1,cur.z));
    130                 }
    131             }
    132             else num++;
    133         }//后走一格
    134         if(cur.y<=B)
    135         {
    136             if(!tower[cur.x][cur.y+1][cur.z])
    137             {
    138                 if(!used[cur.x][cur.y+1][cur.z])
    139                 {
    140 //                    next.x = cur.x;
    141 //                    next.y = cur.y+1;
    142 //                    next.z = cur.z;
    143 //                    Q.push(next);
    144                     Q.push(madeQueue(cur.x,cur.y+1,cur.z));
    145                 }
    146             }
    147             else num++;
    148         }//前走一格
    149         if(cur.z>=1)
    150         {
    151             if(!tower[cur.x][cur.y][cur.z-1])
    152             {
    153                 if(!used[cur.x][cur.y][cur.z-1])
    154                 {
    155 //                    next.x = cur.x;
    156 //                    next.y = cur.y;
    157 //                    next.z = cur.z-1;
    158 //                    Q.push(next);
    159                     Q.push(madeQueue(cur.x,cur.y,cur.z-1));
    160                 }
    161             }
    162             else num++;
    163         }//下走一格
    164         if(cur.z<=C)
    165         {
    166             if(!tower[cur.x][cur.y][cur.z+1])
    167             {
    168                 if(!used[cur.x][cur.y][cur.z+1])
    169                 {
    170 //                    next.x = cur.x;
    171 //                    next.y = cur.y;
    172 //                    next.z = cur.z+1;
    173 //                    Q.push(next);
    174                     Q.push(madeQueue(cur.x,cur.y,cur.z+1));
    175                 }
    176             }
    177             else num++;
    178         }//上走一格
    179     }
    180 //    printf("The number of faces needing shielding is %d.
    ", num);
    181     while(!Q.empty())
    182         Q.pop();
    183 }
    184 bool check(int x, int y, int z)
    185 {
    186     if(x>=0 && x<=A+1 && y>=0 && y<=B+1 && z>=0 && z<=C+1)//应该是A+1,肯定是加2
    187         return true;
    188     return false;
    189 }
    View Code
  • 相关阅读:
    SQL索引一步到位
    Timeout expired超时时间已到. 达到了最大池大小 错误及Max Pool Size设置
    电脑开机的相关设置
    SELECT时为何要加WITH(NOLOCK)
    Sqlserver2008R2 数据库镜像配置步骤
    读写分离提高 SQL Server 并发性能
    八、数据结构
    七、数据库技术基础(二)
    缓存
    七、数据库技术基础(一)
  • 原文地址:https://www.cnblogs.com/ghostTao/p/4332048.html
Copyright © 2011-2022 走看看