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);

			}

		}

	}

}

你可能感兴趣的:(cube)