迷宫

迷宫问题,递归与栈解法:

首先是构建一个正确的迷宫,迷宫中是由二维数组构成,1表示围墙,0表示的是通道,走过的通道将其标识位‘#’,遇到出口符号‘!’就直接退出程序。

 

递归解法:

每走一个通道,就对其进行判断,若是1或是#则退出函数,若是0则将此格其修改为#,再继续对其上下左右的方格用go_out1函数。

void go_out1(char (*maze)[14], int x, int y)//传递的是迷宫和起始的位置。
{
	if (maze[x][y] == '1' || maze[x][y] == '#')
	{
		return ;
	}
	if (maze[x][y] == '!')
	{
		printf("find");
		exit(0);
	}
	maze[x][y] = '#';
	show(maze);
	go_out1(maze, x-1, y);
	go_out1(maze, x, y-1);
	go_out1(maze, x+1, y);
	go_out1(maze, x, y+1);
}

用栈进行循环的解法:

首先引入写好的栈的函数,对二维数组构成的迷宫进行‘0’空格的遍历,直至遇到迷宫出口的标志。走进一个空格,判断该空格的状态,如果是#或者1就不做任何操作,将其前后左右是0的压入栈中。如果是0就进行修改其标志,将其前后左右中是0的压入栈中,从栈中拿出一个进入该空格,做同样的操作。如果进行的次数是遍历了整个数组还没找到出口,则说明栈中出口可能出错,退出该程序。

<pre name="code" class="cpp">typedef struct Typee
{
	int x;
	int y;
}Elem_Type;

void loop_go_out(char (*arr)[14], Elem_Type elem)
{
	Node *stack = create_maze();	
	Elem_Type tmp = elem;
	while (arr[elem.x][elem.y] != '!')
	{
	        if (arr[elem.x][elem.y] == '#' || arr[elem.x][elem.y] == '1')
	        {
			;
	        }
                else if (arr[elem.x][elem.y] == '0')
		{		
			arr[elem.x][elem.y] = '#';
		}

		if (arr[elem.x+1][elem.y] == '0')
		{
			tmp.x = elem.x + 1;
			tmp.y = elem.y;
			push_maze(stack, tmp);
		}
		if (arr[elem.x-1][elem.y] == '0')
		{
			tmp.x = elem.x - 1;
			tmp.y = elem.y;
			push_maze(stack, tmp);
		}
		if (arr[elem.x][elem.y+1] == '0')
		{
			tmp.x = elem.x;
			tmp.y = elem.y + 1;
			push_maze(stack, tmp);
		}
		if (arr[elem.x][elem.y-1] == '0')
		{
			tmp.x = elem.x;
			tmp.y = elem.y - 1;
			push_maze(stack, tmp);
		}

		pop_maze(stack, &elem);	
		if (is_end(arr, elem))
		{
			break;
		}
		max++;
		if (max > row_num *LINE)
		{
			printf("maze is wrong");
			exit(-1);
		}
	}

	arr[elem.x][elem.y] = '#';
	show(arr);
	destory(stack);
	return ;
}

bool is_end(char (*arr)[14], Elem_Type elem)
{
	if ((arr[elem.x+1][elem.y] == '!') || (arr[elem.x-1][elem.y] == '!') || (arr[elem.x][elem.y-1] == '!') || (arr[elem.x][elem.y+1] == '!'))
	{
		return true;
	}
	return false;
}
    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/Learning_zhang/article/details/52938171
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞