定义一个二维数组:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int ma[6][6];//存储图
int v[6][6];//标记数组
int pre[121];//记录每一个结构体的前一个点
struct node
{
int x, y;//横纵坐标
}que[36], q, p;
int xx[] = {0, 0, 1, -1};//横坐标的变化,上下左右四个方向
int yy[] = {1, -1, 0, 0};//纵坐标
void show(int a)
{
int b = pre[a];//指向前一个点
if(b==0)
{
printf("(0, 0)\n");
printf("(%d, %d)\n", que[a].x, que[a].y);
return ;
}
else
show(b);
printf("(%d, %d)\n", que[a].x, que[a].y);
}
void bfs(int a, int b)
{
int front = 0,rear = 0;
p.x = a;
p.y = b;
v[a][b] = 1;
pre[0] = -1;
que[rear++] = p;
while(front<rear)
{
q = que[front];
if(q.x==4&&q.y==4)//走到终点
{
show(front);
return ;
}
for(int i=0;i<4;i++)
{
p.x = q.x + xx[i];
p.y = q.y + yy[i];
if(p.x<0||p.x>=5||p.y<0||p.y>=5||v[p.x][p.y]==1||ma[p.x][p.y]==1)//不符合条件
continue;
pre[rear] = front;
que[rear++] = p;
v[p.x][p.y] = 1;
}
front++;
}
return ;
}
int main()
{
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
scanf("%d", &ma[i][j]);
}
}
memset(v, 0, sizeof(v));
bfs(0, 0);
return 0;
}