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;
}

发表评论

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