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上 ...
随机推荐
- Android MemInfo 各项的意义(转)
http://gdgzzch.blog.163.com/blog/static/37640452201371483147573/ http://stackoverflow.com/questions/ ...
- Jetty源码学习-编译Jetty源码二三事
工作小几个月了,JDK基础和web应用框架学的的差不多了,开始学习Jetty源码,费了小半天才编译成功,把自己拆过的坑记录下来. 编译前的环境: MAVEN 3.3.Eclips eLuna Serv ...
- Android软件开发之EditText 详解(八)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/65718 ...
- 310实验室OTL问题
1.首先是下载OTL文件包,网址是:github.com/O-T-L,可以直接点击网页上的下载链接,也可以使用unlix命令,git clone https://github.com/O-T-L/OT ...
- poj3974 Palindrome【回文】【Hash】【二分】
Palindrome Time Limit: 15000MS Memory Limit: 65536K Total Submissions: 13157 Accepted: 5028 Desc ...
- PHP的线性安全和非线性安全的区别
从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方 ...
- Python开发【笔记】:git&github 快速入门
github入门 简介: 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了. Linus虽然创建了Linux,但Linux的壮大 ...
- 前端调用后端的方法(基于restful接口的mvc架构)
1.前端调用后台: 建议用你熟悉的一门服务端程序,例如ASP,PHP,JSP,C#这些都可以,然后把需要的数据从数据库中获得,回传给客户端浏览器(其实一般就是写到HTML中,或者生成XML文件)然后在 ...
- Ubuntu18.04 英文系统下安装中文输入法
今天尝试了Ubuntu18.04LTS(依旧装的英文版)发现按照之前的方法( http://www.cnblogs.com/asmer-stone/p/5227188.html)安装中文输入法不行了, ...
- MySQL 的mysqldump备份
MySQL 的mysqldump备份 来自<mysql技术内幕 innodb存储引擎> --single-transaction:只对innodb表有效 --lock-tables:对My ...