用dfs TLE 7个点!求助!!!

B3625 迷宫寻路

Little_Fox_Fairy @ 2023-07-23 14:09:25

这是代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int fx[5]={0,0,0,1,-1},fy[5]={0,1,-1,0,0};
char a[101][101];
bool vis[101][101];
void dfs(int x,int y)
{
    if (x==n&&y==m)
    {
        cout<<"Yes";
        exit(0);
    }
    for (int i=1;i<=4;i++)
    {
        int dx=fx[i]+x;
        int dy=fy[i]+y;
        if (dx>=1&&dx<=n&&dy>=1&&dy<=m&&!vis[dx][dy]&&a[dx][dy]!='#')
        {
            vis[dx][dy]=1;
            dfs(dx,dy);
            vis[dx][dy]=0;
        }
    }
    return ;
}
int main()
{
    ios::sync_with_stdio(0);
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    {
        string s;
        cin>>s;
        for (int j=1;j<=m;j++)
          a[i][j]=s[j-1];
    }
    vis[1][1]=1;
    dfs(1,1);
    cout<<"No";
    return 0;
}

用 bfs AC了,但 dfs 为什么会超时呢?


by xiaoyang111 @ 2023-07-25 10:54:29

我也不知道当时老师教我是不是漏写一个回溯,我到后面查了一下要回溯成开始形态,我记得老师写代码的时候没加回溯啊,普通dfs是要写回溯的,但是在这里可以不写回溯,因为这个点true的话之前是走过了不能走(因为回溯回来了嘛),顺便改正一下之前的错误,并不是更优路线,在bfs中是更优路线(除非用优先队列的可能),在dfs中相当于这一个点走不到终点


by xiaoyang111 @ 2023-07-25 10:55:28

我个人一般喜欢用bfs,因为bfs好理解。


by xiaoyang111 @ 2023-07-25 11:06:28

回溯超时了,没办法了QAQ但是在做其他题的时候别忘了回溯,这个题感觉哪里怪怪的有点特殊


by _xm_ @ 2023-07-29 08:57:33

@xiaoyang111 编译器会处理,这种赋值常量(0,1)都会在编译的时候转换,不会影响速度。


by xiaoyang111 @ 2023-07-29 12:49:21

那就是回溯的问题了(正常是要回溯啊?)


上一页 |