Sicily 1114 Food Cubes bfs
这题做得相当纠结,一开始理解错holes, 认为holes是一个格子它的上下左右前后都有一个 foodcubes,WA了无数次下,看了别人的解题报告才知道自己理解错题意,后来改了后,继续WA,不解,解法和别人的基本相同,后来发现那个边界条件错了,这题就是悲剧
用bfs,每次从一个空白点开始搜索,搜索所有与它相连续的空白,直到遇到foodcube和到达边界,
注意!!这里bfs的边界条件要比1小且要比100大,就是说要>= 0 和 <= 101, 搜索的空间要包围整个空间,不能相等,原因是因为当最外层上有两个以上的空白,其他都是foodcubes(即这个空间有几个凹点),不扩大整个搜索空间,算的得答案会偏多,原因是最外层那两个以上的空白需要连在一起,如果搜索空间=整个空间,那么最外层那两个以上的空白会单独计~
#include<iostream> #include <queue> #include <memory.h> using namespace std; struct coordinate { int x, y, z; }; int dirx[6] = {1, -1, 0, 0, 0, 0}; int diry[6] = {0, 0, 1, -1, 0, 0}; int dirz[6] = {0, 0, 0, 0, 1, -1}; bool square[105][105][105]; bool flag[105][105][105]; void bfs(int , int, int); queue<coordinate> Q; coordinate p, tmp; int main() { int cases, n, answer; int x, y, z; cin >> cases; while (cases--) { answer = 0; cin >> n; memset(square, false, 105*105*105*sizeof(bool)); memset(flag, false, 105*105*105*sizeof(bool)); for (int i = 0; i < n; i++) { cin >> x >> y >> z; square[x][y][z] = true; } for (int i = 1; i < 101; i++) for (int j = 1; j < 101; j++) for (int k = 1; k < 101; k++) { if (!flag[i][j][k] && !square[i][j][k]) { bfs(i,j,k); answer++; } } cout << answer-1 << endl; } return 0; } void bfs(int x, int y, int z) { p.x = x; p.y = y; p.z = z; Q.push(p); flag[x][y][z] = true; while (!Q.empty()) { p = Q.front(); Q.pop(); for (int i = 0; i < 6; i++) { tmp.x = p.x + dirx[i]; tmp.y = p.y + diry[i]; tmp.z = p.z + dirz[i]; //注意边界条件 if (tmp.x >= 0 && tmp.x <= 101 &&tmp.y >= 0 && tmp.y <= 101 &&tmp.z >= 0 && tmp.z <= 101 && !square[tmp.x][tmp.y][tmp.z] && !flag[tmp.x][tmp.y][tmp.z]) { flag[tmp.x][tmp.y][tmp.z] = true; Q.push(tmp); } } } }