#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>n||yy>m) 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);
}
博客