迷宫问题
bfs先到的点一定是最短的,因为他是向外扩散,每一层每一层的扩散,和dfs本质区别
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define x first
#define y second
using namespace std;
typedef pair<int,int>PII;
const int M=210,N=1000+10;
int m,n,ans,ecnt;
int dx[4]= {-1,0,1,0};
int dy[4]= {0,1,0,-1};
int g[N][N];
PII pre[N][N];
void bfs(int x,int y) {
queue<PII> q;
q.push({x,y});
memset(pre,-1,sizeof pre);
pre[n][n]={1,1};
while(!q.empty()) {
PII t=q.front();
q.pop();
for(int i=0; i<4; i++) {
int nx=t.x+dx[i],ny=t.y+dy[i];
if(nx<1||ny<1||nx>n||ny>n||g[nx][ny])continue;
if(pre[nx][ny].x!=-1)continue;
q.push({nx,ny});
pre[nx][ny]=t; //记录每个点的前一个节点
}
}
}
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cin>>g[i][j];
}
}
bfs(n,n);//从后先前遍历
PII st;
st.x=1,st.y=1;
while(1) {
cout<<st.x-1<<" "<<st.y-1<<endl;
if(st.x==n&&st.y==n)break;
st=pre[st.x][st.y];//从前向后输出
}
return 0;
}