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-展开评论与隐藏评论
//控制展开评论和隐藏评论 controldiscuss(){ $(".opendiss").click(function(){ if($(this).context.innerH ...
- linux-系统启动流程-7
1,BIOS开机自检,检查cpu硬件及开机启动顺序,查找第一个磁盘磁头的MBR信息并加载BOOtloader,然后将控制权交与bootloader 2, GRUB GRUB(Grand Unified ...
- UI编辑
UI编辑 基本部件介绍 (1)Layout(布局) (2)Space(空间) (3)Button (4)ItemView (5)ItemWidget Widget继承自View,即ListWidget ...
- babel简介——简单介绍与实用(转)
博客讲解内容如下: 1.babel是什么 2.javascript制作规范 3.babel转译器 4.babel的使用 5.常见的几种babel转译器和插件 6.babel最常见配置选项 7.babe ...
- [CSP-S模拟测试]:maze(二分答案+最短路)
题目传送门(内部题88) 输入格式 第一行两个数$n,m$.第二行四个数$sx,sy,tx,ty$.分别表示起点所在行数.列数,终点所在行数.列数.接下来$n$行,每行$m$个数,描述迷宫.最后一行一 ...
- selenium安装环境
selenium自动化环境:selenium+python+chromedriver 驱动/ ie驱动/火狐驱动 1.selenium和python安装 cmd命令里输入:pip install ...
- Python的 counter内置函数,统计文本中的单词数量
counter是 colletions内的一个类 可以理解为一个简单的计数 import collections str1=['a','a','b','d'] m=collections.Counte ...
- jQuery file upload callback options
autoUpload By default, files added to the widget are uploaded as soon as the user clicks on the star ...
- 基于EasyHook实现监控explorer资源管理器文件复制、删除、剪切等操作
一.前言 最近自己在研究一个项目,需要实现对explorer资源管理器文件操作的监控功能,网上找到一些通过C++实现Hook explorer文件操作的方法,由于本人习惯用.NET开发程序,加之C/C ...
- ICML 2019 分析
ICML 2019 分析 Word Embeddings Understanding the Origins of Bias in Word Embeddings Popular word embed ...