【最短路模型】 迷宫问题
传送门
题意
给定一个\(n\),随后给出一个\(n\times n\)的数组,值为\(0\)表示可以通过,值为\(1\)表示是墙壁不能通过
数据范围
\(0\leq n\leq 1000\)
题解
-
遍历的过程中,加入队列\((x,y)\)时都更新当前点的\(pre[x][y]\)
-
最后将所有的数对存入\(vector\)后\(reverse\), 或者从\((n,n)\)点开始走到\((1,1)\)点
Code
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define fi first
#define se second
const int N=1010;
int g[N][N];
int n;
int dx[4]={0,0,1,-1},dy[4]={-1,1,0,0};
bool st[N][N];
pair<int,int>pre[N][N];
void bfs(int x,int y)
{
queue< pair<int,int> > q;
q.push(make_pair(x,y));
memset(pre,-1,sizeof pre);
while(q.size())
{
pair<int,int>t=q.front();
q.pop();
if(t.fi==1 && t.se==1) return;
rep(i,0,3)
{
int tx=t.fi+dx[i],ty=t.se+dy[i];
if(tx<1||tx>n||ty<1||ty>n) continue;
if(g[tx][ty]) continue;
// 代替bool数组的作用
if(pre[tx][ty].fi!=-1) continue;
pre[tx][ty]=t;
q.push(make_pair(tx,ty));
}
}
}
int main()
{
scanf("%d",&n);
rep(i,1,n) rep(j,1,n) scanf("%d",&g[i][j]);
bfs(n,n);
pair<int,int> now = make_pair(1,1);
while(1)
{
printf("%d %d\n",now.fi-1,now.se-1);
if(now.fi == n && now.se ==n) break;
now=pre[now.fi][now.se];
}
}

浙公网安备 33010602011771号