走迷宫//迷宫地图在数据文件maze.in中

走迷宫
已知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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值