1 条题解
-
0
算法标签:
bfs
题解:
使用三维布尔数组cube[MAXN][MAXN][MAXN]来记录每个网格位置是否存在 ACM 模块,MAXN设为 65(略大于题目给定的最大尺寸 60)。三维布尔数组visited[MAXN][MAXN][MAXN]用于记录在搜索过程中每个网格位置是否被访问过。定义结构体Point来表示三维空间中的点,包含x、y、z三个坐标。使用队列queue q来辅助广度优先搜索。广度优先搜索(BFS):从网格的起始位置(0, 0, 0)开始进行 BFS。将起始点加入队列并标记为已访问。在 BFS 循环中,每次从队列中取出一个点cur,遍历其六个相邻方向(通过dx、dy、dz数组表示六个方向的偏移量)。对于每个相邻点(newX, newY, newZ):首先检查该点是否在网格范围内(通过isValid函数判断)。如果该点在范围内且对应位置存在 ACM 模块(即cube[newX][newY][newZ]为true),则说明当前点与 ACM 模块相邻,需要额外屏蔽的面数量count加 1。如果该点在范围内且未被访问过(即!visited[newX][newY][newZ])且该位置没有 ACM 模块(即!cube[newX][newY][newZ]),则将该点加入队列并标记为已访问,以便后续继续搜索。
#include <iostream> #include <cstring> #include <queue> #define CL(x, y) memset(x,y,sizeof(x)) using namespace std; const int MAX = 66; int A, B, C, D, num; int used[MAX][MAX][MAX]; int tower[MAX][MAX][MAX]; int Move[6][3]= {{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}}; bool check(int x, int y, int z); struct node { int x, y, z; }; void BFS(); queue <node> Q; node madeQueue(int xx,int yy,int zz) { node rear; rear.x = xx; rear.y = yy; rear.z = zz; return rear; } int main() { while(cin >> A >> B >> C >> D) { if(!A && !B && !C && !D) break; CL(tower, 0); CL(used, 0); int temp; for(int j = 0; j < D; j++) { cin >> temp; tower[temp%(B*A)%A+1][temp%(B*A)/A+1][temp/(A*B)+1] = 1; } BFS(); cout << "The number of faces needing shielding is " << num << ".\n"; } return 0; } void BFS() { num = 0; Q.push(madeQueue(0,0,0)); while(!Q.empty()) { node cur = Q.front(); Q.pop(); if(used[cur.x][cur.y][cur.z]) continue; used[cur.x][cur.y][cur.z] = 1; if(cur.x >= 1) { if(!tower[cur.x-1][cur.y][cur.z]) { if(!used[cur.x-1][cur.y][cur.z]) { Q.push(madeQueue(cur.x-1,cur.y,cur.z)); } } else num++; } if(cur.x <= A) { if(!tower[cur.x+1][cur.y][cur.z]) { if(!used[cur.x+1][cur.y][cur.z]) { Q.push(madeQueue(cur.x+1,cur.y,cur.z)); } } else num++; } if(cur.y >= 1) { if(!tower[cur.x][cur.y-1][cur.z]) { if(!used[cur.x][cur.y-1][cur.z]) { Q.push(madeQueue(cur.x,cur.y-1,cur.z)); } } else num++; } if(cur.y <= B) { if(!tower[cur.x][cur.y+1][cur.z]) { if(!used[cur.x][cur.y+1][cur.z]) { Q.push(madeQueue(cur.x,cur.y+1,cur.z)); } } else num++; } if(cur.z >= 1) { if(!tower[cur.x][cur.y][cur.z-1]) { if(!used[cur.x][cur.y][cur.z-1]) { Q.push(madeQueue(cur.x,cur.y,cur.z-1)); } } else num++; } if(cur.z <= C) { if(!tower[cur.x][cur.y][cur.z+1]) { if(!used[cur.x][cur.y][cur.z+1]) { Q.push(madeQueue(cur.x,cur.y,cur.z+1)); } } else num++; } } while(!Q.empty()) Q.pop(); } bool check(int x, int y, int z) { if(x >= 0 && x <= A+1 && y >= 0 && y <= B+1 && z >= 0 && z <= C+1) return true; return false; }
- 1
信息
- ID
- 97
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者