题解
【基础】走出迷宫的最少步数
3 条题解
-
0
#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] != '#') {//这里也不用在判断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
#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
#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