top1编程
← 返回题目
题解

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

3 条题解

  • 0
    @ 2026-7-29 20:22:13
    #include <bits/stdc++.h>
    using namespace std;
    char a[45][45];
    //vis数组的数据类型从bool变成int
    int vis[45][45];//现在变成放最小值的位置
    int mini = INT_MAX;
    int r, c;
    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;
    	}
    	//到达终点,要记录最小步数
    	if (x == r && y == c) {
    		mini = step;
    		return;
    	}
    	vis[x][y] = step;
    	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;) {//这里也不用在判断vis[nx][ny] == 0
    			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;
    		}
    	}	
    	dfs(1, 1, 1);
    	cout << mini;
    	return 0;
    }
    
    • 0
      @ 2026-7-29 0:06:21
      #include <bits/stdc++.h>
      using namespace std;
      
      int r, c;
      char a[45][45];
      int dis[45][45];
      int dx[4] = {1, -1, 0, 0};
      int dy[4] = {0, 0, 1, -1};
      
      void dfs(int x, int y, int step) {
          if (step >= dis[x][y]) return;
          dis[x][y] = step;
          for (int i = 0; i < 4; i++) {
              int nx = x + dx[i];
              int ny = y + dy[i];
              if (nx >= 1 && nx <= r &&
                  ny >= 1 && 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];
                  dis[i][j] = 1000000000;
              }
          }
          dfs(1, 1, 1);
          cout << dis[r][c];
          return 0;
      }
      
      • 0
        @ 2026-7-28 22:09:22
        #include <bits/stdc++.h>
        using namespace std;
         
        char a[150][150];
        //存储到达每个点最少需要多少步
        int d[150][150]; 
        int m,n;
        
        //递归求步数 
        void fun(int dep,int i,int j){
        	if(dep < d[i][j]){
        		d[i][j] = dep;
        		if(a[i-1][j] == '.') fun(dep+1,i-1,j); 
        		if(a[i+1][j] == '.') fun(dep+1,i+1,j);
        		if(a[i][j-1] == '.') fun(dep+1,i,j-1);
        		if(a[i][j+1] == '.') fun(dep+1,i,j+1);
        	} 
        }
         
        int main(){
            int i,j;
            cin>>n>>m;
        	 
            //.表示能走,#表示不能走 
            for(i = 1;i <= n;i++){
                for(j = 1;j <= m;j++){
                    cin>>a[i][j];
                    d[i][j] = INT_MAX;
                }
            }
            
            fun(1,1,1);
            cout<<d[n][m]<<endl; 
            
        }
        
        • 1