top1编程
← 返回题目
题解

【基础】走出迷宫的最少步数2

3 条题解

  • 0
    @ 2026-7-29 20:22:15
    #include <bits/stdc++.h>
    using namespace std;
    char a[45][45];
    int vis[45][45];
    int mini = INT_MAX;
    int r, c;
    int s1, s2, e1, e2;
    int dx[4] = {-1, 1, 0, 0};
    int dy[4] = {0, 0, -1, 1};
    void dfs(int x, int y, int step) {
    	//超过答案,不继续搜索了
    	if (step >= mini) {
    		return;
    	} 
    	if (step >= vis[x][y]) {
    		return;
    	}
    	//记录到达这个点的最小步数
    	vis[x][y] = step;
    	//到达终点,要记录最小步数
    	if (x == e1 && y == e2) {
    		mini = step;
    		return;
    	}
    	
    	for (int i = 0; i < 4; i++) {
    		int nx = x + dx[i];
    		int ny = y + dy[i];
    		if (nx > 0 && nx <= r && ny > 0 && ny <= c
    			&& a[nx][ny] != &#39;#&#39;) {
    			dfs(nx, ny, step + 1);	
    		}
    	}
    	
    	
    }
    int main(){
    	cin >> r >> c;
    	for (int i = 1; i <= r; i++) {
    		for (int j = 1; j <= c; j++) {
    			cin >> a[i][j];
    			vis[i][j] = INT_MAX;
    			if (a[i][j] == &#39;S&#39;) {
    				s1 = i;
    				s2 = j;
    			}
    			if (a[i][j] == &#39;T&#39;) {
    				e1 = i;
    				e2 = j;
    			}
    			
    		}
    	}	
    	dfs(s1, s2, 0);//这题和上一题不一样,算的是移动次数
    	cout << mini;
    	return 0;
    }
    
    • 0
      @ 2026-7-29 0:06:21
      #include <bits/stdc++.h>
      using namespace std;
      char a[45][45];
      int vis[45][45];
      int mini = INT_MAX;
      int r, c;
      int s1, s2, e1, e2;
      int dx[4] = {-1, 1, 0, 0};
      int dy[4] = {0, 0, -1, 1};
      void dfs(int x, int y, int step) {
      	//超过答案,不继续搜索了
      	if (step >= mini) {
      		return;
      	} 
      	if (step >= vis[x][y]) {
      		return;
      	}
      	//记录到达这个点的最小步数
      	vis[x][y] = step;
      	//到达终点,要记录最小步数
      	if (x == e1 && y == e2) {
      		mini = step;
      		return;
      	}
      	
      	for (int i = 0; i < 4; i++) {
      		int nx = x + dx[i];
      		int ny = y + dy[i];
      		if (nx > 0 && nx <= r && ny > 0 && ny <= c
      			&& a[nx][ny] != '#') {
      			dfs(nx, ny, step + 1);	
      		}
      	}
      	
      	
      }
      int main(){
      	cin >> r >> c;
      	for (int i = 1; i <= r; i++) {
      		for (int j = 1; j <= c; j++) {
      			cin >> a[i][j];
      			vis[i][j] = INT_MAX;
      			if (a[i][j] == 'S') {
      				s1 = i;
      				s2 = j;
      			}
      			if (a[i][j] == 'T') {
      				e1 = i;
      				e2 = j;
      			}
      			
      		}
      	}	
      	dfs(s1, s2, 0);//这题和上一题不一样,算的是移动次数
      	cout << mini;
      	return 0;
      }
      
      • 0
        @ 2026-7-28 22:09:22
        #include<bits/stdc++.h>
        using namespace std;
        char a[110][110];  // 存储迷宫地图,'.'表示空地,'#'表示墙,'S'表示起点,'T'表示终点
        int d[110][110];   // 记录从起点到每个点的最小步数
        int n,m;           // 迷宫的行数和列数
        int q1,q2,z1,z2;   // q1,q2存储起点坐标,z1,z2存储终点坐标
        int fx[5]={0,0,1,0,-1};  // 方向数组,用于上下左右移动
        int fy[5]={0,1,0,-1,0};  // 方向数组,用于上下左右移动
        // ��度优先搜索函数,x,y为当前位置,k为到当前位置的步数
        void dfs(int x,int y,int k){
        	d[x][y]=k;  // 更新当前位置的最小步数
        	int tx,ty;
        	// 尝试向四个方向移动
        	for(int i=1;i<=4;i++){
        		tx=x+fx[i];
        		ty=y+fy[i];
        		// 判断新位置是否是空地或终点,并且新路径的步数更少
        		if((a[tx][ty]=='.'||a[tx][ty]=='T')&&k+1<d[tx][ty]){
        			dfs(tx,ty,k+1);  // 递归搜索新位置
        		}
        	}
        }
        int main(){
        	cin>>n>>m;    
        	// 读取迷宫地图并初始化距离数组
        	for(int i=1;i<=n;i++){
        		for(int j=1;j<=m;j++){
        			cin>>a[i][j];
        			d[i][j]=INT_MAX;  // 初始化为最大值,表示不可达
        			if(a[i][j]=='S'){  // 记录起点坐标
        				q1=i;
        				q2=j;
        			}
        			if(a[i][j]=='T'){  // 记录终点坐标
        				z1=i;
        				z2=j;
        			}
        		}
        	}
        	dfs(q1,q2,1);  // 从起点开始搜索,初始步数为1
        	cout<<d[z1][z2]-1;  // 输出到终点的最小步数,减1是因为题目中步数从0开始计数
        }
        
        • 1