走迷宫记录路径
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
int a[N][N],dir[4][2]={1,0,-1,0,0,1,0,-1};
bool v[N][N];
int n,m;
struct node
{
int x,y,step;
}pre[N][N];//开一个记忆数组
queue<node>tp;
stack<node>hh;
int bfs(int x,int y,int step)
{
node s,t;
while(!tp.empty())
{
s=tp.front();
tp.pop();
if(s.x==n&&s.y==m)
{
int a=n,b=m;
while(pre[a][b].x!=1||pre[a][b].y!=1)
{
hh.push({pre[a][b].x,pre[a][b].y});
int aa=a,bb=b;
a=pre[aa][bb].x;
b=pre[aa][bb].y;
}
return s.step;
}
for(int i=0;i<4;i++)
{
t.x=s.x+dir[i][0];
t.y=s.y+dir[i][1];
if(!v[t.x][t.y]&&1<=t.x&&t.x<=n&&1<=t.y&&t.y<=m&&!a[t.x][t.y])
{
v[t.x][t.y]=1;
t.step=s.step+1;
pre[t.x][t.y].x=s.x;
pre[t.x][t.y].y=s.y;
tp.push(t);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
tp.push({1,1,0});
v[1][1]=1;
cout<<bfs(1,1,0)<<endl;
while(!hh.empty())//从栈中输出的即为顺序
{
cout<<hh.top().x<<' '<<hh.top().y<<endl;
hh.pop();
}
return 0;
}