• 问答
  • 为什么我的DFS会超时呢(求学长学姐指明一下,谢谢)(已解决)

  • @ 2023-7-2 11:39:59

题目是 #E429. 【基础】走出迷宫的最少步数 第四个样例TEL QAQ(bfs能做)

#include <bits/stdc++.h>
using namespace std;
int n,m,step;
char mp[50][50];
int vis[50][50];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
void dfs(int x,int y,int nstep){
	if(x==n&&y==m){
		step=min(step,nstep);
		return ;
	}
	vis[x][y]=1;
	
	for(int i=0;i<4;i++){
		int nx=x+dx[i];
		int ny=y+dy[i];
		if(nx>0&&ny>0&&nx<=n&&ny<=m&&!vis[nx][ny]&&mp[nx][ny]=='.'){
			dfs(nx,ny,nstep+1);
		}
	}
		vis[x][y]=0;
}
int main(){
	cin>>n>>m;
	
	for(int i=1;i<=n;i++){
     for(int j=1;j<=m;j++){
			cin>>mp[i][j];
		}
	}
	step=n*m+1;
	dfs(1,1,1);
	cout<<step;
	return 0;
}

2 comments

  • @ 2023-7-13 23:28:03

    dfs+记忆化搜索

    #include <bits/stdc++.h>
    using namespace std;
    int n,m,step;
    char mp[50][50];
    int dist[50][50];
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    void dfs(int x,int y,int nstep){
    	if(dist[x][y]>nstep) dist[x][y]=nstep;
    	else return;
    	if(x==n&&y==m){
    		step=min(step,nstep);
    		return ;
    	}
    	for(int i=0;i<4;i++){
    		int nx=x+dx[i];
    		int ny=y+dy[i];
    		if(nx>0&&ny>0&&nx<=n&&ny<=m&&mp[nx][ny]=='.'){
    			dfs(nx,ny,nstep+1);
    		}
    	}
    }
    int main(){
    	cin>>n>>m;
    	memset(dist,0x3f,sizeof(dist));
    	for(int i=1;i<=n;i++){
         for(int j=1;j<=m;j++){
    			cin>>mp[i][j];
    		}
    	}
    	step=n*m+1;
    	dfs(1,1,1);
    	cout<<step;
    	return 0;
    }
    • @ 2023-7-13 23:12:16

      建议bfs,直接写dfs解决这类问题时间复杂度高得多,但dfs如果采用记忆化搜索应该也能过

      • 1