• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

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

posted on 2010-11-13 09:34  sysuwhj  阅读(557)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3