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);
}
}
}
}
浙公网安备 33010602011771号