迷宫问题,递归与栈解法:
首先是构建一个正确的迷宫,迷宫中是由二维数组构成,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;
}