Description
有一个N*M(N,M<=10)的格子迷宫,1代表该格子为墙,不能通过,0代表可以通过,人在迷宫中可以尝试上下左右四个方向移动。
另外,在迷宫中如果从左边走出迷宫会回到迷宫最右边一格(只要该格不是墙),行不变,同样,从右边走出迷宫会回到迷宫最左边一格,向上走出迷宫会回到迷宫最下边一格,向下走出迷宫会回到迷宫最上边一格。
现在给定一个迷宫,以及起点和终点,问最少多少步可以走出迷宫。如果不能走出迷宫输出“die”。
输入格式
该程序为多CASE,第1行为CASE的数量
每一个CASE,第1行为两个数N(行)和M(列)
然后N行每行M个数,之后是起点坐标和终点坐标sc(行) sr(列) ec(行) er(列)
输出格式
如题
输入样例
2
4 3
011
010
110
110
0 0 3 2
2 2
01
10
0 0 1 1
输出样例
4
die
提示
第一个case,可以从(1,0)走到(1,2)
代码如下:
#include <stdio.h>
#include <queue>
using namespace std;
typedef struct{
int r; // row
int c; // column
int s; // step
}LOC;
int sr,sc,dr,dc;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
char d[100][100];
void solve()
{
int m,n,i,nr,nc;
queue<LOC> q;
scanf("%d%d",&m,&n);
for(i=0;i<m;i++) scanf("%s",d[i]);
scanf("%d%d%d%d",&sr,&sc,&dr,&dc);
LOC first={sr,sc,0};
q.push(first);
while(!q.empty())
{
LOC cur=q.front();
q.pop();
if(cur.r==dr&&cur.c==dc)
{
printf("%d\n",cur.s);
return;
}
for(i=0;i<4;i++)
{
nr=cur.r+dir[i][0];
nc=cur.c+dir[i][1];
if(nr<0) nr=m-1;
else if(nr>=m) nr=0;
if(nc<0) nc=n-1;
else if(nc>=n) nc=0;
if(d[nr][nc]=='0')
{
LOC next={nr,nc,cur.s+1};
q.push(next);
d[nr][nc]='1';
}
}
}
printf("die\n");
}
int main()
{
int n;
scanf("%d",&n);
while(n--) solve();
}