洛谷P1141 01迷宫
来源:互联网 发布:中国空军 知乎 编辑:程序博客网 时间:2024/04/30 12:08
题目描述
有一个仅由数字0与1组成的n×n格迷宫。若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。
你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。
输入输出格式
输入格式:
输入的第1行为两个正整数n,m。
下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。
接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格。
输出格式:
输出包括m行,对于每个询问输出相应答案。
输入输出样例
输入样例#1:
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。
果然是比较入门的BFS,适合退役大半年的我复出。。。
加个优化:因为同一路线任意一点延展路径固定,所以我们保存以前路线,下次扫描时判断。
另一种思路:可以用连通块维护并查集,输出该方格所在的联通快的点(然而我都忘了怎么写并查集···)
代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int N=1005,dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};struct node{ int x,y;}x;bool a[N][N];int vis[N][N],n,m,n1=0,rec[N*N];int bfs(node b){ int s=0,i,fx,fy; node t,r; queue<node>q; q.push(b); vis[b.x][b.y]=n1; while(!q.empty()) { r=q.front(); q.pop(); s++; for(i=0;i<4;i++) { fx=r.x+dx[i]; fy=r.y+dy[i]; if(fx>=1&&fx<=n&&fy>=1&&fy<=n&&a[r.x][r.y]!=a[fx][fy]&&!vis[fx][fy]) { t.x=fx; t.y=fy; vis[t.x][t.y]=n1; q.push(t); } } } return s;}int main(){ int i,j; char c; ios::sync_with_stdio(false); cin>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { cin>>c; a[i][j]=c-'0'; } for(i=1;i<=m;i++) { cin>>x.x>>x.y; if(vis[x.x][x.y]) cout<<rec[vis[x.x][x.y]]<<endl; else { n1++; rec[n1]=bfs(x); cout<<rec[n1]<<endl; } } return 0;}
1 0
- 洛谷P1141 01迷宫
- 洛谷P1141 01迷宫
- 洛谷 P1141 01迷宫
- 洛谷P1141 01迷宫
- 洛谷P1141 01迷宫
- 洛谷 P1141 01迷宫
- |洛谷|BFS|P1141 01迷宫
- 【搜索】洛谷 P1141 01迷宫
- 洛谷P1141 01迷宫 解题报告
- P1141 01迷宫题解
- P1141 01迷宫
- P1141 01迷宫
- P1141 01迷宫
- P1141 01迷宫
- Luogu P1141 01迷宫
- 【p1141-01迷宫】解题记录
- [luogu]P1141 01迷宫-宽搜
- (洛谷)【P1141】01迷宫 [广度搜索][高性能]
- 可靠性99.999%互联网微服务的架构设计
- 关于可变参数的函数
- 使用ngrok让微信公众平台通过80端口访问本机
- 《Windows核心编程》之”内存体系结构“
- VMWare三种网络模式图解
- 洛谷P1141 01迷宫
- [LeetCode] 66. Plus One
- 用ViewPager实现微信tab切换
- java按一定数量补0,随机数获取
- 一些经常用的网址
- Java学习笔记--类加载机制
- java读取遍历excel
- 【C#新手的白痴疑难】2016.7.28
- ios 打印