题目描述:
样例:
题解:
这道题是典型的BFS题型,记录下一跳所有方向的数量,选择是进入下一步还是原地踏步,来进行步数的更新。当然,也可以开一个数组,利用前驱+1来记录每一个坐标到出发点点的最短距离。
除此之外,开一个数组不断记录前驱,可以找到终点到起点的路径。
代码:
#include <iostream> #include <queue> #include <cstdio> #include <algorithm> using namespace std; int const N = 105; char mp[N][N]; int minstep = 10005; int tt[N]; struct Dian{ int x,y; }; queue<Dian> q; Dian d[N][N]; Dian start; void bfs(int step){ Dian s; if(!q.empty()){ s = q.front(); q.pop(); }else{ return; } if(mp[s.x][s.y] == 'G'){ if(step < minstep){ minstep = step; } return; } mp[s.x][s.y] = '#'; Dian tmp; if(mp[s.x-1][s.y] == '.' || mp[s.x-1][s.y] == 'G'){ tmp.x = s.x-1; tmp.y = s.y; d[tmp.x][tmp.y] = s; q.push(tmp); tt[step+1]++; } if(mp[s.x][s.y-1] == '.' || mp[s.x][s.y-1] == 'G'){ tmp.x = s.x; tmp.y = s.y-1; d[tmp.x][tmp.y] = s; q.push(tmp); tt[step+1]++; } if(mp[s.x+1][s.y] == '.' || mp[s.x+1][s.y] == 'G'){ tmp.x = s.x+1; tmp.y = s.y; d[tmp.x][tmp.y] = s; q.push(tmp); tt[step+1]++; } if(mp[s.x][s.y+1] == '.' || mp[s.x][s.y+1] == 'G'){ tmp.x = s.x; tmp.y = s.y+1; d[tmp.x][tmp.y] = s; q.push(tmp); tt[step+1]++; } tt[step]--; if(tt[step] <= 0){ bfs(step+1); }else{ bfs(step); } } void showit(int x,int y){ if(x == start.x && y == start.y){ return; } Dian tmp = d[x][y]; showit(tmp.x,tmp.y); cout << "(" << x << "," << y << ")" << endl; } int main() { int n,m; int endx,endy; cin >> n >> m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin >> mp[i][j]; if(mp[i][j] == 'S'){ start.x = i; start.y = j; } if(mp[i][j] == 'G'){ endx = i; endy = j; } } } q.push(start); bfs(0); cout << minstep << endl; showit(endx,endy); return 0; }