sll00 @ 2024-03-01 17:00:56
B3625 迷宫寻路
求助
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=1000;
ll bu[4][2]={{1,0},{-1,0},{0,1},{0-1}};
char arr[maxn][maxn];
int n, m,nx,ny,dx,dy,wall;
bool judge=false;
void dfs(int nx,int ny)
{
if((nx<1||ny<1||nx>n||ny>m))
return;
if(nx==n&&ny==m)
{
judge=true;
return;
}
if(judge)
return;
for(int i =0;i<4;i++)
{
if(arr[nx+bu[i][0]][ny+bu[i][1]]!='#')
{
arr[nx+bu[i][0]][ny+bu[i][1]]='#';
dfs(nx+bu[i][0],ny+bu[i][1]);
//arr[nx+bu[i][0]][ny+bu[i][1]]='.';
}
}
return;
}
int main()
{
nx=1,ny=1;
cin>>n>>m;
dx=n,dy=m;
for(int i =1;i<=n;i++)
{
for(int j =1;j<=m;j++)
{
cin>>arr[i][j];
if(arr[i][j]=='#')
wall++;
}
}
//事前剪枝
if(n*m-wall-2<abs(dx-nx)+abs(dy-ny)-1)
cout<<"No";
else
{
arr[nx][ny]='#';
dfs(nx,ny);
if(judge)
cout<<"Yes";
else
cout<<"No";
}
return 0;
}
在dfs中加了回溯操作,导致若干的样例TLE。
蒻蒻的问问为什么
by CaoXian @ 2024-03-01 18:19:33
@sll00 你可以模拟一个递归栈,回溯就是顶端的进程结束过后返回次顶端的操作,它使得「回溯后,从次顶端继续搜索」和「一开始就这样搜索」得到的效果是一样的。
by sll00 @ 2024-03-01 18:21:12
@VividCycle 感谢,基本的我还是了解的,我说的是用bfs重新写一遍,当然不会有回溯
by shoot_down @ 2024-03-01 20:36:15
@sll00 可是你原来的代码加个读入优化就能过啊
https://www.luogu.com.cn/record/148864196
by sll00 @ 2024-03-01 21:59:49
@shoot_down 因为我把那个回溯注释掉了,你看看