走迷宫//迷宫地图在数据文件maze.in中
来源:互联网 发布:轴承数据 编辑:程序博客网 时间:2024/04/28 07:39
走迷宫已知N*N迷宫地图在数据文件maze.in中,找出一条从源点(sx,sy)到目标点(tx,ty)的通路。#include "stdio.h"#define N 20main( ){ 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;}