走迷宫
已知N*N迷宫地图在数据文件maze.in中,找出一条从源点(sx,sy)到目标点(tx,ty)的通路。
#include "stdio.h"
#define N 20
main( )
{ int a[N][N]; /* 可以定义为char类型,这样可存放大地图 */
int sx, sy, tx, ty, t, i, j, k, n, x, y;
int dx[4], dy[4];
struct { int x;
int y;
int k; } path[N*N]; /* 存放找到通路坐标和走向 */
FILE *fp;
/* 下面从文件读迷宫地图 */
fp=fopen("maze.in", "r");
fscanf(fp,"%d\n",&n);
for(i=0;i<n; i++)
for(j=0;j<n;j++)
fscanf(fp,"%d",&a[i][j]);
fscanf(fp,"%d %d %d %d",&sx,&sy,&tx,&ty);
fclose(fp);
dx[0]=1; dy[0]=0; /*dowm的增量*/
dx[1]=0; dy[1]=1; /* right的增量 */
dx[2]=-1; dy[2]=0; /* up 的增量*/
dx[3]=0; dy[3]=-1; /* left 的增量*/
t=0; x=sx; y=sy; k=-1;
path[0].x=sx; path[0].y=sy;
path[0].k = -1;
do {
do
{ ◆k++;
◆x+=dx[k]; y+=dy[k]; /*选走向K时走到的当前坐标*/
◆if ( (x>=0)&&(x<n)
&& (y>=0)&&(y<n)
&& (a[x] [y]==0) ) /* 能走 */
{
t++;
path[t].x=x; path[t].y=y;
path[t].k=k; /*记录通路*/
a[x] [y]=-1; /*封锁以防重复判断*/
if ((x==tx)&&(y==ty))
goto Lout; /*找到目标点,跳出二重循环*/
else
k=-1; /*继续向前搜索 */
}
◆else /* 还原,以便换走向*/
{ x-=dx[k]; y-=dy[k]; }
} while (k<3);
/* 走不动时,以下回溯*/
k=path[t].k;
t--; x=path[t].x; y=path[t].y;
} while (t>=0);
Lout:
for(i=0; i<=t; i++)
printf("(%d %d) \n", path[i].x , path[i].y);
return 0;
}
走迷宫//迷宫地图在数据文件maze.in中
最新推荐文章于 2020-05-23 18:25:05 发布