洛谷P1457 城堡 The Castle /1104 USACO 2.1 城堡 (foodfill)

博客详细介绍了洛谷P1457题及USACO 2.1 城堡问题的解决方案。内容包括对题目复杂输入的解读、利用位运算处理输入数据,以及通过BFS(广度优先搜索)算法求解城堡的房间数目和最大房间面积。此外,博主还阐述了如何在第二部分中判断移除哪面墙能得到最大房间,并给出了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:
洛谷
学校OJ

读题

当初看到这道题时,我的内心是奔溃的:
什么魔鬼输入?!
什么恶心要求?!
我 *(数据删除)
算了,还是好好做题吧。

输入处理

通过观察,我们可以知道每一个数都可以这样分解
假设某行有一个数 11 11 11,我们可以:把它拆成二进制:
11= 1 0 1 1
1/表示南面有墙
0/表示东面没有墙
1/表示北面有墙
1/表示西面有墙
所以我们可以设一个布尔类型三维数组 a [ i , j , 4 ] a[i,j,4] a[i,j,4]
表示第 i i i行第 j j j列西,北,东,南分别有木有墙。
那么问题来了:如何对每一位进行判断?
c++有一套特别神奇的东西,叫位运算
用它们就可以进行对每一个二进制位的运算。
在这里,我假设你们都明白它们的作用,我们就可以将运算简化为这样:

for(int i=1;i<=m;i++)
		for(register int j=1;j<=n;j++)
		{
   
			cin>>x;
			for(int v=1;v<=4;v++) a[i][j][v]=1<<(v-1)&x;
		}

第一部分(城堡的房间数目,最大的房间的大小)

这两个简单,可以直接一波BFS搞定
对BFS过的点进行标记,如果出现有未搜过的点就进行一次广搜并将计数器加一
上这一片段代码

for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			if(!a[i][j][0])
			{
   
				y=1;
				++d;
				q.push((tt){
   i,j});
				while(!q.empty())
				{
   
					ww=q.front();
					q.pop();
					for(register int k=1;k<=4;k++)
						if(!a[ww.x][ww.y][k]&&!b[ww.x+dx[k]][ww.y+dy[k]]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值