这题只需要从起点走到终点,所以选择bfs;
#include<bits/stdc++.h> using namespace std; int n,m,sx,sy,tx,ty; int mp[1010][1010],vis[1000010],pre[1010][1010];//pre数组存放(x,y),(dx,dy)是由(x,y)转移过来的 int d[4][2]={{1,0},{0,1},{0,-1},{-1,0}}; bool bfs() { queue<int> q; q.push(sx*m+sy); vis[sx*m+sy]=1; while(!q.empty()) { int k=q.front();q.pop(); int x=k/m,y=k%m; if(x==tx&&y==ty) return 0; if(mp[x][y]==4) { for(int i=0;i<4;i++) { int dx=x+d[i][0],dy=y+d[i][1]; if(dx>=n||dy>=m||dx<0||dy<0) continue; if(vis[dx*m+dy]) continue; vis[dx*m+dy]=1; pre[dx][dy]=x*m+y; q.push(dx*m+dy); } } else{ int k=mp[x][y]; int dx=x+d[k][0],dy=y+d[k][1]; if(dx>=n||dy>=m||dx<0||dy<0) continue; if(vis[dx*m+dy]) continue; vis[dx*m+dy]=1; pre[dx][dy]=x*m+y; q.push(dx*m+dy); } } } int main() { cin>>n>>m>>sx>>sy>>tx>>ty; sx--,sy--,tx--,ty--;//这里我是从0开始 memset(mp,-1,sizeof(mp)); memset(pre,-1,sizeof(pre)); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { char ch; cin>>ch; if(ch=='w') mp[i][j]=3; if(ch=='s') mp[i][j]=0; if(ch=='a') mp[i][j]=2; if(ch=='d') mp[i][j]=1; if(ch=='.') mp[i][j]=4; } } bfs(); int u=tx,v=ty; while(pre[u][v]!=-1)//反向复原路径 { int k=pre[u][v]; int x=k/m,y=k%m; if(x>u&&mp[x][y]==4) mp[x][y]=3; if(x<u&&mp[x][y]==4) mp[x][y]=0; if(y<v&&mp[x][y]==4) mp[x][y]=1; if(y>v&&mp[x][y]==4) mp[x][y]=2; u=x,v=y; } cout<<n<<' '<<m<<' '<<(sx+1)<<' '<<(sy+1)<<' '<<(tx+1)<<' '<<(ty+1)<<endl; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(mp[i][j]==3) cout<<'w'; if(mp[i][j]==0) cout<<'s'; if(mp[i][j]==2) cout<<'a'; if(mp[i][j]==1) cout<<'d'; if(mp[i][j]==4) cout<<'w';//对于这种(哪个方向都能走到终点)的结点,随意写个字母 } cout<<endl; } }