luogu P1141 01迷宫
https://www.luogu.org/problem/show?pid=1141
还不太会用 BFS
然后就跟着感觉走了一波
经历了很多错误 刚开始的读入 然后BFS的过程
最后T三个点
看到别人的题解思路 后 自己改了一次
用dp[i][j] 记录 i ,j是在哪个联通快里面的
然后 ans[cnt] 记录 第cnt个联通块的结果
//bfs + 记忆话搜索
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
int n,m;
char mp[][];
int dp[][]; //记录每个点的情况的父亲节点
bool vis[][];
int fx[]={-,,,};
int fy[]={,-,,};
int ans[* +];//存储结果
int cnt = ;
bool check(int x,int y,char k)
{
if(vis[x][y]== && mp[x][y] == k && x>= && x<=n && y<=n && y>= )
{
return ;
}
return ;
}
int bfs(int x,int y)
{
int sum = ;
queue<pii> que;
que.push({x,y});
//cout<< "yes1 "<<endl;
//vis[x][y] = 1;
while (que.size())
{
pii now = que.front(); que.pop();
//cout<< "yes2 "<<endl;
if(vis[now.first][now.second] )
continue;
sum++;
vis[now.first][now.second] = ;
dp[now.first][now.second] = cnt;
char k = (mp[now.first][now.second] == '')?'':'';
for(int i=;i<;i++)
{
//cout<< "yes3 "<<endl;
int dx = now.first +fx[i];
int dy = now.second + fy[i];
//cout << dx <<" "<<dy<<endl;
if(check(dx,dy,k))
{
//sum++;
//cout<< "yes4 "<<endl;
que.push({dx,dy});
}
//vis[dx][dy] = 1;
}
}
//cout<<sum<<endl;
ans[cnt++] = sum;
return sum;
}
int main ()
{
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf(" %c", &mp[i][j]);
while (m--)
{
//memset(vis,0,sizeof(vis));
int x,y;
scanf("%d %d",&x,&y);
if( dp[x][y] )
{
cout<< ans[ dp[x][y] ]<<endl;
continue;
}
cout<< bfs(x,y)<<endl;
}
}
luogu P1141 01迷宫的更多相关文章
- luogu P1141 01迷宫 x
P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...
- Luogu P1141 01迷宫【搜索/dfs】By cellur925
题目传送门 我tm到现在还需要刷这种水搜索...我退役吧. 但就是搜索弱嘛 补一补嘛qwq 题目大意:给你一张地图与许多询问,每次询问求这个点所在联通块的点的个数. 所以这个题目的本质就是在求联通块. ...
- [洛谷Luogu]P1141 01迷宫[联通块 并查集]
题目链接 大致题意 相邻格子不同为连通,计算每个点所在的连通块大小. 想法 我采用了并查集的做法. 开一个辅助数组记录连通块大小,每次合并的时候更新父亲节点的大小即可. 一个点先与它上面的点判定,若判 ...
- 洛谷——P1141 01迷宫
P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...
- P1141 01迷宫
https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样 ...
- 洛谷P1141 01迷宫
题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...
- 洛谷 P1141 01迷宫
看似普通的 bfs 题(实际上也不怎么难 主要是我太菜了) 题目链接:https://www.luogu.org/problemnew/show/P1141 如果直接用简单的bfs一顿求的话,会超时( ...
- P1141 01迷宫 dfs连通块
题目描述 有一个仅由数字000与111组成的n×nn \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻444格中的某一格111上,同样若你位于一格1上,那么你可以移动到相邻444格 ...
- P1141 01迷宫 DFS (用并查集优化)
题目描述 有一个仅由数字00与11组成的n \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上 ...
随机推荐
- iOS5 ARC学习笔记:strong、weak等详解
2013-03-25 13:41 佚名 oschina 字号:T | T iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的.现在我们看看iOS5 ...
- chrome inspect 离线调试-工具包 怎么使用
1.找到相关目录: C:\Users\当前用户\AppData\Local\Google\Chrome\User Data\Default 2.找到以下文件夹: 1.Application Cache ...
- IntelliJ Idea 2018 注册码
转自:http://idea.lanyus.com/ *.lanyus.com及*.qinxi1992.cn下的全部授权服务器已遭JetBrains封杀 请搭建自己的IntelliJ IDEA授权服务 ...
- zabbix安装配置2
1.平台:centos6.5 2.安装epel: yum install http://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch ...
- 微信小程序 --- app.json文件
app.json文件用于配置项目:用于对小程序进行全局设置: pages:定义小程序的路由.(凡是不在这个配置里面的东西,都无法打开) (特别注意:结尾不能有 逗号 否则会出错) window:定义小 ...
- BFS+状态压缩DP+二分枚举+TSP
http://acm.hdu.edu.cn/showproblem.php?pid=3681 Prison Break Time Limit: 5000/2000 MS (Java/Others) ...
- Oracle Schema Objects——Sequences(伪列:nextval,currval)
Oracle Schema Objects 序列的作用 许多的数据库之中都会为用户提供一种自动增长列的操作,例如:在微软的Access数据库之中就提供了一种自动编号的增长列(ID列).在oracle数 ...
- JavaScript如何把字符串中每个单词首字母转化为大写
先上代码,再做解释. 思路分析: 1. 首先先把字符串中的单词转化为小写(toLowerCase),再对其进行截取(split),截取依据为按照空格截取: 2. 此时经过步骤一之后得到的东西是一个数组 ...
- form表单上传图片问题:线下可以而线上不可以
由于上传图片需要一定时间,而线下速度快线上速度慢. 所以如果你的上传窗口是弹出界面,那么就会面临上传未完成就关闭了该界面.导致上传失败.
- git-【四】撤销修改和删除文件操作
一:撤销修改: 比如我现在在readme.txt文件里面增加一行 内容为555555555555,我们先通过命令查看如下: 在未提交之前,发现添加5555555555555内容有误,所以得马上恢复以前 ...