#include<iostream> #include<algorithm> #include<queue> using namespace std; typedef long long ll; const int maxn=1e3+100; int vis[maxn][maxn]; char a[maxn][maxn]; int b[maxn][maxn]; struct node{ int x; int y; }; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int n,m,sx,sy,ex,ey; int ans=0; int bfs(int x,int y){ queue<node>q; node no,nx; no.x=x; no.y=y; q.push(no); vis[x][y]=1; b[x][y]=1; int f; while(!q.empty()){ no=q.front(); q.pop(); int x1=no.x; int y1=no.y; if(x1==ex&&y1==ey)//若走到了 { f=1; node road[1110];//用来记录路径 int k=1; while(!(x1==sx&&y1==sy))//通过b数组来找到之前是哪一个点走到x,y的 { road[k].x=x1; road[k++].y=y1; for(int i=0;i<4;i++) { int xx=x1+dx[i]; int yy=y1+dy[i]; if(xx<1||yy<1||xx>8||yy>8) continue;//超出范围的不要 if(b[xx][yy]==b[x1][y1]-1) { x1=xx;//倒退回去 y1=yy; break;//一定要跳出,要把更新的x,y放到road里 } } } road[k].x=sx;//别忘了把起点放进去 road[k].y=sy; for(int i=k;i>=1;i--)//输出路径 { cout<<road[i].x<<" "<<road[i].y<<endl; } } if(f){ break; } for(int i=0;i<4;i++){ nx.x=no.x+dx[i]; nx.y=no.y+dy[i]; if(nx.x<=0||nx.y<=0||nx.x>n||nx.y>m||a[nx.x][nx.y]==‘1‘||vis[nx.x][nx.y]==1)continue; vis[nx.x][nx.y]=1; b[nx.x][nx.y]=b[no.x][no.y]+1; q.push(nx); } } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } cin>>sx>>sy>>ex>>ey; int t=bfs(sx,sy); }
#include<iostream>#include<algorithm>#include<queue> using namespace std;typedef long long ll;const int maxn=1e3+100;int vis[maxn][maxn];char a[maxn][maxn];int b[maxn][maxn];struct node{ int x; int y;};int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int n,m,sx,sy,ex,ey;int ans=0;int bfs(int x,int y){ queue<node>q; node no,nx; no.x=x; no.y=y; q.push(no); vis[x][y]=1; b[x][y]=1; int f; while(!q.empty()){ no=q.front(); q.pop(); int x1=no.x; int y1=no.y; if(x1==ex&&y1==ey)//若走到了 { f=1; node road[1110];//用来记录路径 int k=1; while(!(x1==sx&&y1==sy))//通过b数组来找到之前是哪一个点走到x,y的 { road[k].x=x1; road[k++].y=y1; for(int i=0;i<4;i++) { int xx=x1+dx[i]; int yy=y1+dy[i]; if(xx<1||yy<1||xx>8||yy>8) continue;//超出范围的不要 if(b[xx][yy]==b[x1][y1]-1) { x1=xx;//倒退回去 y1=yy; break;//一定要跳出,要把更新的x,y放到road里 } } } road[k].x=sx;//别忘了把起点放进去 road[k].y=sy; for(int i=k;i>=1;i--)//输出路径 {cout<<road[i].x<<" "<<road[i].y<<endl; } } if(f){ break;} for(int i=0;i<4;i++){ nx.x=no.x+dx[i]; nx.y=no.y+dy[i]; if(nx.x<=0||nx.y<=0||nx.x>n||nx.y>m||a[nx.x][nx.y]==‘1‘||vis[nx.x][nx.y]==1)continue; vis[nx.x][nx.y]=1;b[nx.x][nx.y]=b[no.x][no.y]+1; q.push(nx); } }}int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j];} } cin>>sx>>sy>>ex>>ey; int t=bfs(sx,sy);}
原文:https://www.cnblogs.com/lipu123/p/14013687.html