题解
【基础】走出迷宫的最少步数2
3 条题解
-
0
#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
#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
#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