解题思路:从后往前找最短路径,也就是q中先放入n-1,n-1.最后遍历从0,0开始遍历memory数组,最后把n-1,n-1加上(这里注意queue是q.front()),这样直接省去了从后往前遍历再储存的空间(方法参考acwing)
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
typedef pair<int,int> pii;
int dx[4]={0,-1,0,1};
int dy[4]={1,0,-1,0};
const int N=1005;
int a[N][N];
pii memory[N][N];
void bfs(int n){
queue<pii>q;
q.push({n-1,n-1});
a[n-1][n-1]=1;
while(!q.empty()){
pii t=q.front();
q.pop();
for(int i=0;i<4;i++){
int tx=t.first+dx[i];
int ty=t.second+dy[i];
if(tx>=0&&tx<n&&ty>=0&&ty<n&&a[tx][ty]==0){
a[tx][ty]=1;
q.push({tx,ty});
memory[tx][ty]=t;
}
}
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)cin>>a[i][j];
bfs(n);
int i=0,j=0;
while(i!=n-1||j!=n-1){
cout<<i<<" "<<j<<endl;
int x=memory[i][j].first;
int y=memory[i][j].second;
i=x;
j=y;
}
cout<<n-1<<" "<<n-1;
return 0;
}