18440 走迷宫2
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
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>
typedef struct
{
int row;
int col;
int count;
}Lct;
Lct b[1000];
int dir[][2]={{0,1},{1,0},{0,-1},{-1,0}};
int func(Lct b[],int k,int n,int m)
{
int min;
int a=1;
for(int i=0;i<k;i++)
{
if(b[i].row==n-1&&b[i].col==m-1)
{
if(a==1)
{
min=b[i].count;
a++;
}
if(b[i].count<min)
{
min=b[i].count;
}
}
}
return min;
}
int main()
{
b[0].row=0;
b[0].col=0;
b[0].count=0;
int T;
scanf("%d",&T);
int a[10][10];
while(T--)
{
int flag=0;
char ch;
int i,j,k=1;
int n,m;
int row;
int col;
scanf("%d %d\n",&n,&m);
int row_start;
int col_start;
int row_end;
int col_end;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
ch=getchar();
a[i][j]=ch-'0';
}
ch=getchar();
}
scanf("%d %d %d %d",&row_start,&col_start,&row_end,&col_end);
for(i=0;i<k;i++)
{
for(j=0;j<4;j++)
{
row=b[i].row+dir[j][0];
col=b[i].col+dir[j][1];
if(row==n&&j==1&&a[0][col]==0)
{
b[k].row=0;
b[k].col=col;
b[k].count=b[i].count+1;
k++;
}
else if(col==m&&j==0&&a[row][0]==0)
{
b[k].row=row;
b[k].col=0;
b[k].count=b[i].count+1;
k++;
}
else if(row==-1&&j==3&&a[n-1][col]==0)
{
b[k].row=n-1;
b[k].col=col;
b[k].count=b[i].count+1;
k++;
}
else if(col==-1&&j==2&&a[row][m-1]==0)
{
b[k].row=row;
b[k].col=m-1;
b[k].count=b[i].count+1;
k++;
}
else if(row>=0&&col>=0&&row<n&&col<m&&a[row][col]==0)
{
b[k].row=row;
b[k].col=col;
b[k].count=b[i].count+1;
if(b[k].row==row_end&&b[k].col==col_end)
{
flag=1;
}
k++;
}
}
a[b[i].row][b[i].col]=1;
}
if(flag)
{
printf("%d\n",func(b,k,n,m));
}
else printf("die\n");
}
return 0;
}