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),问某一个 ...
随机推荐
- C# 获得对象的命名空间 ?.
A a = new A(); var t = a?.ToString(); //t = WebApplication1.Controllers.A //获得命名空间和类名 var t1 = (A)nu ...
- java文件断点续传的简单实现
一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...
- Codechef SEAARC Sereja and Arcs (分块、组合计数)
我现在真的什么都不会了呢...... 题目链接: https://www.codechef.com/problems/SEAARC 好吧,这题其实考察的是枚举的功力-- 题目要求的是\(ABAB\)的 ...
- SQL Server 分割字符串和合并多条数据为一行
分割字符串函数 create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20) ...
- spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- 对AC自动机+DP题的一些汇总与一丝总结 (1)
(1)题意 : 输入n.m.k意思就是给你 m 个模式串,问你构建长度为 n 至少包含 k 个模式串的方案有多少种 分析:(HDU2825) DP[i][j][k] 表示 DP[第几步][哪个节点结尾 ...
- Vue/Element-ui 安装搭建开发环境(一)
Element 是饿了么全段开发团队推出的一套基于 vue.js2.0 的 PC Web 端开发框架. Element 中文文档:https://element.eleme.cn/#/zh-CN 1. ...
- architecture 20190628
https://abp.io/ --ABP v2 官网 https://grpc.io/ --gRPC官网 https://devblogs.microsoft.com/dotnet/introdu ...
- 六、IDEA-SpringBoot项目设置热部署
啥是热部署!???(不要去查了,,同学) 根据上面的提示,我们已经完成了Spring Boot项目的创建和运行,但是有一个问题就是,每次修改代码之后都需要重新启动调试,代码才能生效,比较麻烦,那有没有 ...
- 前端必须掌握的 nginx 技能(1)
概述 作为一个前端,我觉得必须要学会使用 nginx 干下面几件事: 代理静态资源 设置反向代理(添加https) 设置缓存 设置 log 部署 smtp 服务 设置 redis 缓存(选) 下面我按 ...