【最短路模型】 迷宫问题

传送门

题意

给定一个\(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];
   }
}

posted @ 2020-10-30 20:50  Hyx'  阅读(69)  评论(0)    收藏  举报