-
描述
-
这是一道很简单的迷宫简化版:
Kivi迷失在一个神秘的森林里,只有越过一些障碍,他才能逃出去~
为了简化问题,森林可以简化为一个矩阵,矩阵里的元素只有0和1两个状态,0表示可以越过,1则表示有障碍,无法通过.Kivi一开始处在矩阵的(0,0)的位置,即第一行第一列的位置,而出口在最后一行最后一列的位置(测试数据保证初始位置和出口都是可以通行的,即为状态0).
现在的问题是,给出森林矩阵的初始状态,要你的程序算出Kivi逃出森林所要的最短时间T.假定Kivi每次都只能往上,下,左,右四个方向走过一格的距离,且每走一格耗时1.当然,在到达出口之前,Kivi是不能越出矩阵的,因为森林外面已经没有路了~
-
输入
-
多组测试数据,对于每组测试数据,第一行包含两个正整数r,c,表示矩阵的行数和列数,接下来有r行,每行有一个长为c的字符串(中间没有空格),字符串由0和1组成.(2<r<=30,2<c<=30).
输出
-
如果kivi能逃出森林,输出一个整数T,即最少用时,否则输出"Impossible!"(不含引号).答案保证在int范围内
样例输入
-
3 3 011 000 110 3 3 011 111 000
样例输出
-
4 Impossible!
#include<stdio.h> #include<string.h> #define MAX 10000 #define N 35 /*BFS*/ struct Queue { int x,y,pre; }; struct Queue qu[MAX]; int front,rear; char mp[N][N]; void SetBoard(int r,int c);//加边 int MgPath(int r,int c);//求迷宫时间 void Output(int r,int c);//输出,测试用 int main() { int c,r; int i; while(scanf("%d%d",&r,&c)!=EOF) { getchar(); for(i=1;i<=r;i++) scanf("%s",mp[i]+1); SetBoard(r,c); i = MgPath(r,c); if (i!=-1) printf("%d\n",i); else printf("Impossible!\n"); // Output(r,c); } return 0; } int MgPath(int r,int c) { int t = -1,i,j; front = rear = -1; qu[++rear].x = 1;//起点进栈,题目默认为0,0,但加了边,起始位置为1,1 qu[rear].y = 1; qu[rear].pre = -1; mp[1][1] = '1'; int dir = -1; while(front<rear) { i = qu[++front].x; j= qu[front].y; if (i==r &&j==c) { do { t++; front = qu[front].pre;//方向遍历求路径长度 }while(front!=-1); return t; } dir = -1; while(dir<4) { dir++; switch(dir)//四个方向 { case 0: i = qu[front].x - 1; j = qu[front].y;break; case 1: i = qu[front].x; j = qu[front].y + 1;break; case 2: i = qu[front].x +1; j = qu[front].y;break; case 3: i = qu[front].x; j = qu[front].y- 1;break; } if (mp[i][j]=='0')//该方向可走则进栈 { ++rear; qu[rear].x = i; qu[rear].y = j; mp[i][j] = '1'; qu[rear].pre = front; //记录前一个路径的位置 } } } return -1; } void Output(int r,int c) { int i,j; for(i=0;i<=r+1;i++) { for(j=0;j<=c+1;j++) printf("%c",mp[i][j]); putchar('\n'); } } void SetBoard(int r,int c) { int i,j; for(i=0;i<=c+1;i++) mp[0][i] = '1'; for(i=0;i<=r+1;i++) mp[i][0] = '1'; for(i=0;i<=c+1;i++) mp[r+1][i] = '1'; for(i=0;i<=r+1;i++) mp[i][c+1] = '1'; }
-