P1141零一迷宫
这是一道对于除了我之外其他人都十分简单的搜索题,我终于在这个夜里搞会了。
首先其问可以到达多少个点,并不是走一次可以最多经过几个点,这就解释了为什么不需要回溯,并且递归边界则是让其全部走完即可。于是便写了程序,然后TLE 了三个点,因为时间复杂度可能会达到5e8 O(1000+4000)*100000。其实早就知道要用联通块去写,到处翻题解,终于找到了一篇属于我的,感谢那位dalao,还有lyx和两位讨论版大佬。首先我们要知道只要是两个点联通,那么这两个点能到达的点的数量是一样的——所以我们只需要搜索有几个联通块,然后这个联通块的格子里能到达的格子数量就是这个联通块所包含的格子数!然后我们就需要一个k记录有多少个联通块,num[k]记录每个联通块的格子数量,那么book[x][y]则表示他所属于的联通块即可,=0的话还是说明他没有被遍历过,k++搜索他。
1.空间&时间复杂度一定计算仔细
2.正确理解题意,不要总是套回溯的模板,结果这个题,,,
3.联通块要熟练掌握,但是注意先决条件,思考是不是同一个块里的数量相同
4.学习中,有困难也去突破,回头发现其实并不难
代码(有点玄学的是把数组开大了一位之后就90-100了)
#include<bits/stdc++.h>
using namespace std;
int n,m;
int book[][];
char mp[][];
int ans[],num[];//存答案所在联通块以及联通块的格子数量
int k=;//联通块数量
int step=;
int dx[]={,-,,};//右下左上
int dy[]={,,-,};
void dfs(int x,int y,int k){
book[x][y]=k;
for(int i=;i<=;i++){
int tx=dx[i]+x;
int ty=dy[i]+y;
if(mp[tx][ty]!=mp[x][y]){
if(tx>&&ty>&&tx<=n&&ty<=n&&book[tx][ty]==){
step++;//格子数量++
dfs(tx,ty,k);//继续往下搜索
}
}
}
}
int main(){
cin>>n>>m;
for(int i=;i<=n;i++){//读入
for(int j=;j<=n;j++){
cin>>mp[i][j];
book[i][j]=;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(book[i][j]==){
k++;
step=;
dfs(i,j,k);
num[k]=step;
}
}
}
for(int i=;i<=m;i++){
int x,y;
cin>>x>>y;
ans[i]=num[book[x][y]];
}
for(int i=;i<=m;i++){
cout<<ans[i]<<endl;
}
return ;
}
P1141零一迷宫的更多相关文章
- P1141 01迷宫
https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样 ...
- 洛谷——P1141 01迷宫
P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...
- luogu P1141 01迷宫 x
P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...
- 洛谷P1141 01迷宫
题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...
- 01迷宫 洛谷 p1141
题目描述 有一个仅由数字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上 ...
- 洛谷P1141 01迷宫【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1141 题意: 有一个填了0和1的n*n的格子,只能0走到1,1走到0 有m组询问(数据量是1e5),问某一个 ...
随机推荐
- JS Null 空 判断
JS判断对象是否为空 https://www.cnblogs.com/mountain-mist/articles/1600995.html http://www.cftea.com/c/2007/0 ...
- Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks(用于深度网络快速适应的元学习)
摘要:我们提出了一种不依赖模型的元学习算法,它与任何梯度下降训练的模型兼容,适用于各种不同的学习问题,包括分类.回归和强化学习.元学习的目标是在各种学习任务上训练一个模型,这样它只需要少量的训练样本就 ...
- CSS 手动画热销小图标
效果图 HTML 标签 <div class="main"> <div class="small"> <div class=&qu ...
- gridbagsizer
#coding:utf-8 import wx labels='1 2 3 4 5 6 7 8 9 '.split() class TestFrame(wx.Frame): def __init__( ...
- selenium+常见操作
1.多窗口操作 有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了.获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了. 句 ...
- [CSP-S模拟测试]:简单计算(数学)
题目传送门(内部题104) 输入格式 第一行一个正整数$T$,表示该测试点内的数据组数,你需要对该测试点内的$T$组数据都分别给出正确的答案才能获得该测试点的分数. 接下来$T$组数据,每组数据一行两 ...
- layui select动态添加option
<form class="layui-form" action=""> <div class="layui-form-item pr ...
- 微信小程序打印json log
微信小程序中如果 res.data数据是一个json格式数据.console.log("===data===" + res.data);//如果这样打印出了是只会打印一个对象名称, ...
- 阶段3 1.Mybatis_11.Mybatis的缓存_2 延迟加载和立即加载的概念
用户关联的account信息,假设一个用户管理的account有100个.那么我们在查询用户的时候那100个关联的信息也被查询出来. 用的时候才去查关联的数据 这两个不同的地方就是查询的时机不同 什么 ...
- Eclipse设置保存时自动格式化代码
在使用eclipse时,经常需要使用到Ctrl+Shift+F来格式化代码,可以打开保存时格式化,会更方便. 打开方式:Window-->Preferences-->Java --> ...