K - 迷宫问题
Crawling in process...
Crawling failed
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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<string.h>
int visit[100][100];
int e[100][100];
typedef struct node
{
int x;
int y;
}NODE;
NODE path[100];
NODE que[1000];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int head,tail;
int len;
int main()
{
int i,j;
int x,y;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
scanf("%d",&e[i][j]);
}
}
head=tail=1;
que[head].x=1;
que[head].y=1;
visit[1][1]=1;
tail++;
while(head<tail)
{
for(i=0;i<4;i++)
{
x=que[head].x;
y=que[head].y;
x+=dir[i][0];
y+=dir[i][1];
if(x>=1&&x<=5&&y>=1&&y<=5)
{
if(visit[x][y]==0&&e[x][y]==0)
{
visit[x][y]=visit[que[head].x][que[head].y]+1;
if(x==5&&y==5)
{
len=visit[x][y];
break;
}
que[tail].x=x;
que[tail].y=y;
tail++;
}
}
}
head++;
}
path[len].x=5;
path[len].y=5;
for(i=len-1;i>=1;i--)
{
for(j=0;j<4;j++)
{
x=path[i+1].x+dir[j][0];
y=path[i+1].y+dir[j][1];
if(visit[x][y]==i)
{
path[i].x=x;
path[i].y=y;
}
}
}
for(i=1;i<=len;i++)
{
printf("(%d, %d)\n",path[i].x-1,path[i].y-1);
}
return 0;
}
BFS 基本代码:
int i,j;
int x,y;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
{
scanf("%d",&e[i][j]);
}
}
head=tail=1;
que[head].x=1;
que[head].y=1;
visit[1][1]=1;
tail++;
while(head<tail)
{
for(i=0;i<4;i++)
{
x=que[head].x;
y=que[head].y;
x+=dir[i][0];
y+=dir[i][1];
if(x>=1&&x<=5&&y>=1&&y<=5)
{
if(visit[x][y]==0&&e[x][y]==0)
{
visit[x][y]=visit[que[head].x][que[head].y]+1;
if(x==5&&y==5)
{
len=visit[x][y];
break;
}
que[tail].x=x;
que[tail].y=y;
tail++;
}
}
}
head++;
}
求路径代码:
path[len].x=5;
path[len].y=5;
for(i=len-1;i>=1;i--)
{
for(j=0;j<4;j++)
{
x=path[i+1].x+dir[j][0];
y=path[i+1].y+dir[j][1];
if(visit[x][y]==i)
{
path[i].x=x;
path[i].y=y;
}
}
}
for(i=1;i<=len;i++)
{
printf("(%d, %d)\n",path[i].x-1,path[i].y-1);
}
测试数据:
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
结果数据:
这样求最短路径非常方便:
核心:
visit[x][y]=visit[][]+1;
然后向四个方向遍历,找到那个len-1 的方向放进path数组里面