首页 > 其他分享 >[刷题笔记] ybt1250:The Castle

[刷题笔记] ybt1250:The Castle

时间:2023-06-03 23:11:13浏览次数:55  
标签:ybt1250 判断 int 二进制 maxn PAIR Castle include 刷题

Problem

Solution

显然bfs,只不过扩散的时候需要判断墙

那么如何判断墙呢?题目只给出了每个方块墙方向的和

原来的思路是可以暴力,很复杂但是可做,代码就不给了。

后来教练讲到了可以用位运算巧妙实现,这里重点介绍一下:


首先,我们观察一下每面墙代号的二进制:

十进制 二进制
1 0001
2 0010
4 0100
8 1000

有同学可以不怎么了解二进制,我们再举几个例子:

十进制 二进制
2+4 0110
1+2 0011
1+2+4 0111
1+2+4+8 1111

发现什么没有?判断有没有这面墙,令需要判断的数为\(x\),判断x>>i&1如果为1,则有墙(i为西北东南四个方向,下标从0开始)
为什么这样可以?举个例子,对二进制0110判断,让其右移2位(判断东墙),右移完为0,则没有东墙,更没有南墙。

本题巧妙地运用了位运算使得代码变得简洁容易实现,位运算的用法还有很多,比如使用>>优化除法,这里不再赘述了,但是我们要学会在代码中运用位运算优化,这也是本题的妙处。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define N 1010
using namespace std;
typedef pair<int,int> PAIR;
int n,m;
int mapp[N][N];
int dx[4] = {0,-1,0,1}; //注意西北东南四个方向要按照顺序
int dy[4] = {-1,0,1,0};
int vis[N][N];
int maxn = -1,cnt = 0;
void bfs(int x,int y)
{
	queue <PAIR> q;
	q.push(PAIR(x,y));
	vis[x][y] = 1;
	int sum = 1;
	while(!q.empty())
	{
		maxn = max(maxn,sum);
		PAIR p =q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			int ax = p.first+dx[i];
			int ay = p.second+dy[i];
			int flg = (mapp[p.first][p.second]>>i)&1;
			if(ax>=1&&ax<=n&&ay>=1&&ay<=m&&!vis[ax][ay]&&!flg)
			{
				sum++;
				vis[ax][ay] = 1;
				q.push(PAIR(ax,ay));
			}
		}
}
}
int main()
{
	scanf("%d%d",&n,&m);
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++) scanf("%d",&mapp[i][j]);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++) 
		{
			if(!vis[i][j]) 
			{
				vis[i][j] = 1;
				cnt ++;
				bfs(i,j);
			}
		}
	}
	cout<<cnt<<endl<<maxn<<endl;
	return 0;
}

标签:ybt1250,判断,int,二进制,maxn,PAIR,Castle,include,刷题
From: https://www.cnblogs.com/SXqwq/p/17454958.html

相关文章

  • Bouncy Castle SM2加解密
    配置过程下载相关包。我参考了连接:https://blog.csdn.net/weixin_42221688/article/details/90475014修改配置文件$JAVA_HOME$\jre\lib\security\java.security,在末尾添加security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider;测试:代码运行sm2_demo......
  • [刷题笔记] ybt1255:迷宫问题
    题目传送门Solution数据范围很小,一共才\(5\times5\),所以乱搞做法很多比如我一开始就先bfs单纯跑最短路,然后dfs找路径但是忘回溯被嘲讽其实可以边bfs边记录路径,因为bfs是按层数搜的,所以第一次到达终点的路径一定是最优的。那么如何记录路径呢?我原来用pair,经教练指导发现可以......
  • BouncyCastle
    BouncyCastle任务详情在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考附件内容完成SM2加解密的内容,提交运行结果截图(10‘)完成SM3,SM4算法的调用,提交运行结果截图和代码(15’,选做)1.jar包下载bcprov-ext-jdk15to18-1.73.jar[bcprov-jdk15to18-1.73.jar](htt......
  • 算法刷题记录:素数中的等差数列
    题目链接https://ac.nowcoder.com/acm/contest/19859/I题目分析模拟!模拟!模拟!下标要计算好。自己的思路是放发现两个相等的差时,说明至少可以输出了,也就是合法情况,然后用指针R往后扩展。我选择的R是闭区间的,即[L,R]的区间已经看过了,所以i可以直接从i+1开始看。所以R赋值给i后......
  • BouncyCastle
    BouncyCastle在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考附件内容完成SM2加解密的内容,提交运行结果截图完成SM3,SM4算法的调用,提交运行结果截图和代码BouncyCastle配置下载jar包bcprov-ext-jdk15to18-1.73.jarhttps://jar-download.com/?search_bo......
  • 算法刷题记录:[NOIP1999]回文数
    题目链接https://ac.nowcoder.com/acm/contest/19859/G题目分析高精度相加+进制转换+判断回文的模拟题。AC代码//Problem:[NOIP1999]回文数//Contest:NowCoder//URL:https://ac.nowcoder.com/acm/contest/19859/G//MemoryLimit:262144MB//TimeLimit:20......
  • 算法刷题记录:素数五五
    题目链接https://ac.nowcoder.com/acm/contest/19859/E题目分析一道找规律的题,我们注意33,当33的长度一样,我们只要无脑添加4和8即可。4和8的关系与33的关系:有n个33,就有n-1个4或8。在此基础之上,因为会出现a和b的33长度不相同的情况,这时候我们只要统计a和b的33个数的差就行了......
  • 2023-06-03 刷题
    练习英文描述算法56.合并区间-力扣(LeetCode)[mid,非常好展示思路]分析:Firstsorttheintervalsbystarttime,sothatwecaneasilyfindwhichintervalscanbemergedbycheckingintervalsfromlefttoright.Useoneexampletodemotheprocess.(e.g.use......
  • BouncyCastle
    任务详情在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务参考附件内容完成SM2加解密的内容,提交运行结果截图(10‘)2完成SM3,SM4算法的调用,提交运行结果截图和代码(15’,选做)jar包下载官网:https://www.bouncycastle.org/latest_releases.htmlbcprov-ext-jdk15to18-1.......
  • 2023年5月刷题记录
    2023年5月1日leetcode1376.通知所有员工所需的时间链接地址:https://leetcode.cn/problems/time-needed-to-inform-all-employees/题意:公司里有n名员工,每个员工的ID都是独一无二的,编号从0到n-1。公司的总负责人通过headID进行标识。在manager数组中,每个员工都......