Menu
0 Comments

一个走迷宫的程序

    本文赡养第一c语言版的走迷宫的顺序。迷宫的宽度度和地平纬度,迷宫矩阵,迷宫的插入物和去世都是从锉刀中读取的。。顺序率先读取迷宫录音。,那时的显示迷宫矩阵。,惟一剩下的,运用迷宫搜索议事程序来找寻大大地。,并输入。

1. 迷宫的表现。
迷宫是由建筑学矩阵表现的。
包住迷宫矩阵
迷宫的宽度,迷宫的地平纬度,
迷宫插入物并列的,迷宫去世并列的。
建筑学规定列举如下:

typedef struct _step
{
int x;
//行并列的
int y;
列并列的
}STEP;

typedef struct _matrix
{
int data[MAX_WIDTH+2][MAX_WIDTH+2]; 迷宫录音,0:表达方式,1:表达墙
int width;
矩阵宽度(迷宫),包住最左派的和2堵墙。
int height;
矩阵宽度(迷宫),包住顶部和根据的2个墙。
STEP entrance;迷宫插入物
STEP exit;
迷宫去世
}MATRIX;

迷宫矩阵的每个元素可以是0或1。,0意义跑路。,1意义墙。,走窒碍。
为了便于反省它可能的选择划掉了边境。,就是,并列的超过了迷宫的一定尺寸的。。迷住1个录音被添加到迷宫的4个使锋利。,4墙,为了,在究竟哪个时辰,不会的划掉边境。。上面的录音代表1个5×5迷宫。,补充部分4堵墙后,现实宽度和地平纬度变化为7。,迷宫适宜1×7×7矩阵。

1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 1,
1, 1, 0, 1, 0, 1, 1,
1, 0, 0, 1, 1, 1, 1,
1, 0, 1, 0, 0, 0, 1,
1, 0, 0, 0, 1, 0, 1,
1, 1, 1, 1, 1, 1, 1,

2。算法

  走迷宫的大大地的每一步构成疑问句和否定句二元组(x,y)来表现。已经过的大大地产卵在阻塞大大地中。。

率先,将参加比赛的人并列的放在阻塞中。,在这点上,大大地阻塞说得中肯元素数量是1。

接下来,运用上面的管理。,沉思找到出路

1. 从本期财务状况,即阻塞的惟一剩下的第一元素。,从右,下,左,四向搜索,看一眼人们能不能经过。。
假使你找到了又路,则
将新的使获得座位的并列的放入path阻塞,阻塞一定尺寸的加1。
假使新使获得座位的并列的比得上E的并列的,搜索完毕。
假使人们四外乱窜,则
将迷宫的本期财务状况设置为1。,为了,电液体的最低温度流动点生产量了一面墙。,下次我不会的在这么名列前茅上。。并戒除阻塞说得中肯主体元素。,阻塞一定尺寸的缩减了1
假使阻塞的一定尺寸的为0,缺乏路可走。,搜索完毕。

迷住加密都构成疑问句和否定句。:

#include 
#include 
#include 
#include 

#define MAX_WIDTH    30
#define MAX_HEIGHT   30

typedef struct _step
{
	int X;/行并列的
	int y;			列并列的
}STEP;

typedef struct _matrix
{
	int data[MAX_WIDTH+2][MAX_WIDTH+2]; 迷宫录音,0:表达方式,1:表达墙
	int width;				矩阵宽度(迷宫),包住最左派的和2堵墙。
	int height;				矩阵宽度(迷宫),包住顶部和根据的2个墙。
	STEP entrance;				迷宫插入物
	STEP exit;				迷宫去世
}MATRIX;

MATRIX Gy矩阵=/ /设定初值为迷宫。,顺序还可以读取锉刀说得中肯迷宫录音。
{
	{
		{1, 1, 1, 1, 1, 1, 1},
		{1, 0, 0, 0, 0, 0, 1},
		{1, 1, 0, 1, 0, 1, 1},
		{1, 0, 0, 1, 1, 1, 1},
		{1, 0, 1, 0, 0, 0, 1},
		{1, 0, 0, 0, 1, 0, 1},
		{1, 1, 1, 1, 1, 1, 1},
	},
	7,7,7行,7列,包住4堵墙。
	{1,1},插入物并列的系
	{5,5 } /导出并列的
};


static STEP  s_shift[]=
{
	{1,0},		//右向走, x++, y 坚定性
	{0,1},		//下降的走,  x 坚定性, y++
	{-1,0},		//向左走,  x--, Y坚定性性
	{0,1使缓慢地移动/升。,  x 坚定性, y--
};

void print_paths(STEP path[],int path_len) //用脚踩踏走迷宫的大大地
{
	int i;
	for (i=0;i0)
PrimTf(->)
(%d),%d)",path[i].x, path[i].y);
	}
}

void print_Matrix(MATRIX* PMatrix)/用脚踩踏迷宫录音,迷宫录音包住4个壁。
{
	int i,j;
	for (i=0;i地平纬度;I
	{
		for (j=0;j宽度;J
		{
			if (j!=0)
Primtf( ");
Prtf(%d),pMatrix->data[i][j]);
		}
PrTNF(\n)
	}
}

int search_path(int matric[MAX_WIDTH+2][MAX_WIDTH+2],
				STEP path[],int path_len,STEP 去世)
{
	while (1)
	{
		int i,bFind;
		STEP newPos;
		
		for (bFind=0,i=0;i<4;i++)  //从右,下,左,上,查找新的可以走的使获得座位
		{
			 = path[path_len-1].x + s_shift[i].x; 
			 = path[path_len-1].y + s_shift[i].y;
			
			if ( path_len==1 )
			{
				if ( [][]==0)
				{
					bFind=1; break; //找到第一使获得座位
				}

			}
			// path[path_len-1]表现本期财务状况,path[path_len-2]表现上一步的使获得座位,
			// 假使新的使获得座位比得上上第一使获得座位,将陷入循环,故要求新的使获得座位不能是上一步的使获得座位
			else if ( ( != path[path_len-2].x || !=path[path_len-2].y) && [][]==0)
			{
				bFind=1; break;		//找到第一使获得座位
			}
		}
		
		if (bFind) 
		{
			path[path_len++]=newPos; //将新的使获得座位追加到path阻塞,大大地一定尺寸的+1
			if ( ==exit.x && ==exit.y)
				return path_len;
		}
		else
		{
			matric[path[path_len-1].x][path[path_len-1].y]=1; //从本期财务状况,无路可走,将本期财务状况标记为墙
			path_len--;		//回退一步
			if ( path_len==0)
				return path_len;
		}
	}
}

int readMatrix(char *file)
{
	char line[1024];
	FILE *fp=NULL;
	int i,j,x,y;

	fp=fopen(file,"rt");
	if (fp==NULL)
	{
		printf("Can not open file %s\n",file);
		return 0;
	}

	memset(&(g_matrix),0,sizeof(g_matrix));
FGET(线),SIZEOF(线)- 1,FP)
	
	sscanf(line,"%d %d",&x,&y);					//读入迷宫的行数和列数
	if ( x>MAX_WIDTH || y>MAX_HEIGHT)
	{
Primtf( Matrix is too large\n");
FSET(FP)
		return 0;
	}

	g_matrix.width=x+2;							//在4条边补充部分4堵墙,宽度和地平纬度补充部分了2。
	g_matrix.height=y+2;
	
	for (j=0;j<)
	{
		[0][j]=1;					//第一行为墙
		[][j]=1;	//惟一剩下的一行为墙
	}

	for (i=0;i<)		
	{
		[i][0]=1;					//最左派的的列为墙
		[i][]=1;	//最右边的列为墙
	}

	
	for (i=1;i<;i++)
	{
		char *p;
	FGET(线),SIZEOF(线)- 1,FP)
		j=1; 
		p=line;
		while (1)
		{
			while ( *p=='' '' ||*p== 9)//跳过空格符号
				p++;

			if ( *p>=''0'' && *p<=''9'')
			{
				sscanf(p,"%d",&([i][j]));  //读入地i行j列的录音
				while ( *p>=''0'' && *p<=''9'')
					p++;			//录音已经读入,跳过当前的数字
				j++;
			}

			if (j>=)
				break;
		}
	}
	
FGET(线),SIZEOF(线)- 1,FP)
	
读取参加比赛的人并列的和列并列的,去世行并列的,列并列的
	sscanf(line,"%d %d %d %d",&(),&(),&(),&());
	fclose(FP) fp=NULL;
	
	++;  补充部分了一排墙。,因而插入物横并列的  1
	g_matrix.entrance.y++;  静止摄影又线是墙。,因而插入物并列的  1
	++;      补充部分了一排墙。,因而插入物横并列的  1
	++;	    补充部分了一排墙。,因而插入物并列的  1

	return 1;
}

int main()
{
	STEP path[MAX_WIDTH*MAX_HEIGHT];
	int step_count;

	if ( !readMatrix("") )  不要运用设定初值录音,从锉刀中读取迷宫录音
	{
		return 0;					  //读取失律,直地跳出
	}

Primtf( matrix is\n");
	print_Matrix(&g_matrix);

大大地〔0〕=g-矩阵。插入物 将插入物使获得座位产卵在大大地阻塞中。
	step_count = search_path(,path,1,g_matrix.去世); //查找又大大地,大大地的每个搬家的并列的被产卵在大大地装饰中。
	if (step_count>0)					      //找到又出路,步数>0
	{
PrTNF(n\n path is\n");
		print_paths(path,step_count);
	}
	else							     //步数<=0, 缺乏找到出路	
		printf("No solution\n");
	return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注