题目网址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=18&page=show_problem&problem=1594
题目大意:二维迷宫求最短路
解题思想:标准BFS
代码:
#include <cstdio>
#include <queue>#include <cstring>
using namespace std;
#define MAXN 1100
int map[MAXN][MAXN],book[MAXN*MAXN];
const int dir[4][2] = {{-1,0},{0,-1},{0,1},{1,0}};
int main()
{
int R,C;
while(scanf("%d%d",&R,&C)&&R!=0&&C!=0)
{
int k;
scanf("%d",&k);
memset(map,0,sizeof map);
for(int i=0;i<k;i++)
{
int r,n;
scanf("%d%d",&r,&n);
for (int j=0;j<n;j++)
{
int x;
scanf("%d",&x);
map[r][x]=1;
}
}
int x,y;
scanf("%d%d",&x,&y);
int start=x*C+y;
scanf("%d%d",&x,&y);
int finish=x*C+y;
queue<int>q;
memset(book,-1,sizeof book);
q.push(start);book[start]=0;
while (!q.empty())
{
int u=q.front();
q.pop();
if (u==finish)break;
int x=u/C;
int y=u%C;
for (int i=0;i<4;i++)
{
int dx=x+dir[i][0],dy=y+dir[i][1];
int v=dx*C+dy;
if (dx>=0&&dx<R&&dy>=0&&dy<C&&map[dx][dy]==0&&book[v]==-1)
{
book[v]=book[u]+1;
q.push(v);
}
}
}
printf("%d\n", book[finish]);
}
return 0;
}