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. 从本期财务状况,即阻止的末尾一个人元素。,从右,下,左,四向搜索,看一眼我们的能不能经过。。
万一你找到了条款路,则
将新的安置使调和放在渠道阻止中。,阻止尺寸加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;
}

发表评论

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