博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对于联通块的处理
阅读量:6671 次
发布时间:2019-06-25

本文共 1543 字,大约阅读时间需要 5 分钟。

01迷宫

题目描述

有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。

你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

输入输出格式

输入格式:

输入的第1行为两个正整数n,m。

下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。

接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。

输出格式:

输出包括m行,对于每个询问输出相应答案。

输入输出样例

输入样例:

2 2

01
10
1 1
2 2

输出样例1:

4

4

说明

所有格子互相可达。

对于20%的数据,\(n≤10\)

对于40%的数据,\(n≤50\)

对于50%的数据,\(m≤5\)

对于60%的数据,\(n≤100\)\(m≤100\)

对于100%的数据,\(n≤1000\)\(m≤100000\)


对于这一到搜索题,怎么搜索不是重点,重点是如何处理一个个联通块。

对于满分数据,每次询问遍历一边的是不可能的,这辈子都是不可能的。

我们可以染色或用并查集维护集合

这一道题它启示我们,在处理拥有同一个性质的联通块时,要整块整块的处理

#include
#include
using namespace std;int dp[1010][1010],map[1010][1010];bool exist[1010][1010];int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0};int n,m,z;queue
ox;queue
oy;int find(int x,int y){ if(exist[x][y]) return dp[x][y]; exist[x][y]=true; int lx,ly; ox.push(x);oy.push(y); z++; for(int i=0;i<4;i++) { lx=x+dx[i];ly=y+dy[i]; if(lx>0&&lx<=n&&ly>0&&ly<=n&&!exist[lx][ly]&&map[lx][ly]!=map[x][y]) find(lx,ly); } return dp[x][y];}int main(){ cin.sync_with_stdio(false); cin>>n>>m; char input; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>input; map[i][j]=input-'0'; dp[i][j]=1; } int a,b; for(int i=1;i<=m;i++) { cin>>a>>b; find(a,b); z=max(z,dp[a][b]); cout<
<

转载于:https://www.cnblogs.com/Lance1ot/p/8494563.html

你可能感兴趣的文章
Redis 哨兵集群
查看>>
linux 证书颁发的两种方法
查看>>
1007_C/C++笔试题_16:16道c语言面试【15/16】
查看>>
Spring异常Ambiguous mapping found.
查看>>
Linux运维工具
查看>>
年末苦逼找工作
查看>>
我的友情链接
查看>>
电脑检测维修规范,注意事项,常见故障排除,维修技巧
查看>>
笔记二
查看>>
hive2.1.0 安装
查看>>
移动终端开发_高端课程
查看>>
我的友情链接
查看>>
提交服务器汉字乱码解决方法
查看>>
Android SDK:构建一个购物中心搜索的应用(二)-Points of Interest
查看>>
关于android使用自己的launcher替换默认launcher的方法
查看>>
ASP.NET 4.5 MVC实战教程 MVC视频教程
查看>>
Excel编辑模块openpyxl的常用功能介绍
查看>>
通过TFTP服务器拷贝路由器的配置文件到本地
查看>>
南方电网广东公司荣获“IT用户最佳实践案例奖”
查看>>
Yesod - 数据库 (9)
查看>>