洛谷P1141 题解

原题链接:https://www.luogu.com.cn/problem/P1141

看到DALAO们写的DFS的题解十分感叹,但总感觉少了点东西于是决定自己写一篇DFS的题解

这道题的标签给的是广度优先搜索,但是貌似DFS更简单

但是...

注意了!!!这道题并不是简单的DFS!!!

此题矩阵的边长较小只有1000,只是它要求计算的点达到了100000,由此我们可以计算得到如果按照普通的DFS极端数据会达到:1000 * 1000 * 100000=10的11次方也许有人会问作者有那么变态吗,是的!!!作者真的出了这个点!!!(太变态了

傻乎乎的我用普通DFS第一次就T了3个点。。。

如何优化?

在此引入连通块的思想:简单来说你可以把连通块看成传染性极强的肺炎病毒“1”,“1”走到哪里与它的密切接触者都会感染肺炎病毒“1”;与此相同,我们假设一个病毒“2”,接触了病毒“2”的都会变成病毒“2”——接触者皆同化。

只要是这次走过的方块都会变得和此次的答案一样,也就可以不再走它了,时间一下就少了一小半

就按照这个思路,我提交的代码仍然T了2个点

还有什么优化?

对已经走过的点的搜索用了n * n,这里可以用一个队列来存所有走过的点。代码再次改进后,终于过了(艰辛

在此附上代码(有点繁杂不想改了):

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,one[1001][1001],ans,ansn[1001][1001];
char zero[1001][1001];
int cun[100000001][2],cun_sum=0;
void dfs(int a,int b,int k);
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int u=1;u<=n;u++){
cin>>zero[i][u];
}
}
for(int i=1;i<=m;i++){
ans=1;cun_sum=0;
int a,b;
cin>>a>>b;
one[a][b]=i;
if(ansn[a][b]==0){
dfs(a,b,i);
for(int i=0;i<cun_sum;i++){
ansn[cun[i][0]][cun[i][1]]=ans;
}
}
cout<<ansn[a][b]<<endl;
}
return 0;
}
void dfs(int a,int b,int k){
cun[cun_sum][0]=a;cun[cun_sum++][1]=b;
if(a+1<=n&&one[a+1][b]!=k&&zero[a+1][b]+zero[a][b]==97){
ans++;
one[a+1][b]=k;
dfs(a+1,b,k);
}
if(b+1<=n&&one[a][b+1]!=k&&zero[a][b+1]+zero[a][b]==97){
ans++;
one[a][b+1]=k;
dfs(a,b+1,k);
}
if(a-1>0&&one[a-1][b]!=k&&zero[a-1][b]+zero[a][b]==97){
ans++;
one[a-1][b]=k;
dfs(a-1,b,k);
}
if(b-1>0&&one[a][b-1]!=k&&zero[a][b-1]+zero[a][b]==97){
ans++;
one[a][b-1]=k;
dfs(a,b-1,k);
}
return ;
}
posted @   flywatre  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示