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. 从本期财务状况,即街区的充分地第一元素。,从右,下,左,四向搜索,看一眼we的所有格形式能不能经过。。
假定你找到了一则路,则
将新的态度的译成同等放入path街区,街区广大地域加1。
假定新态度的译成同等数量E的译成同等,搜索完毕。
假定we的所有格形式四外乱窜,则
将迷宫的本期财务状况设置为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;
}

发表评论

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