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),问某一个 ...
随机推荐
- JAVA笔记25-IO流(3)-处理流举例
处理流类型: 1.缓冲流 例1: import java.io.*; public class TestBufferStream{ public static void main(String arg ...
- java——AtomicInteger 中 incrementAndGet与getAndIncrement 两个方法的区别
https://blog.csdn.net/chenkaibsw/article/details/81031950 源码: getAndIncrement: public final int getA ...
- 详解GSM的基带跳频和射频跳频
跳频技术源于军事通信,目的是为了获得较好的保密性和抗干扰能力.跳频分为快速和慢速两种,GSM中的跳频属于慢跳频. 跳频方式从时域概念上分为帧跳频和时隙跳频,从载频实现方式上分为射频跳频和基带跳频. 帧 ...
- Swiper 的引入
1. 从官网下载必要资源 https://www.swiper.com.cn/download/index.html#file1 2. 在项目中<head>中引入swiper.min.cs ...
- #420 Div2 Problem B Okabe and Banana Trees (math && 暴力枚举)
题目链接 :http://codeforces.com/contest/821/problem/B 题意 :给出 m 和 b 表示在坐标轴上的一条直线 要求你在这条直线和x.y轴围成的区域中找出一个 ...
- mysql 安装教程(详细说明)
如果你装过,一定要先卸载干净,并且重启重新装.卸载教程(保证成功)https://www.cnblogs.com/qzhc/p/11354678.html 大家都知道MySQL是一款中.小型关系型数据 ...
- jsp四种属性范围
在JSP提供了四种属性的保存范围.所谓的属性保存范围,指的就是一个设置的对象,可以在多个页面中保存并可以继续使用.它们分别是:page.request.session.appliction. 1.pa ...
- insert和insertSelective区别
两者的区别在于如果选择insert 那么所有的字段都会添加一遍即使没有值 <insert id="insert" parameterType="com.ego.po ...
- springboot+mybatis+SpringSecurity 实现用户角色数据库管理(一)
本文使用springboot+mybatis+SpringSecurity 实现用户权限数据库管理 实现用户和角色用数据库存储,而资源(url)和权限的对应采用硬编码配置. 也就是角色可以访问的权限通 ...
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_5 mybatis中使用poolead配置连接的原理分析
idelConnection是空闲的链接 idelConnection就是ArrayList的数组 如果没有空闲的就new一个 新的connection 一个空闲池,一个活动的池,一个链接过来.空闲池 ...