初学dfs,求dalao加回溯为什么错

B3625 迷宫寻路

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 可是你原来的代码加个读入优化就能过啊 33ms 啊。

https://www.luogu.com.cn/record/148864196


by sll00 @ 2024-03-01 21:59:49

@shoot_down 因为我把那个回溯注释掉了,你看看


上一页 |