Algorithm 迷宫求解算法不适用于4个方向

Algorithm 迷宫求解算法不适用于4个方向,algorithm,Algorithm,这是我对经典迷宫问题的解决方案。如果我只允许两个移动(向下或向右),并且只有这两个移动可以建立一条路径,那么它的工作就完美了。然而,如果我想允许所有4种可能的移动(向下、向右、向左、向上),程序永远不会给出解决方案(似乎递归堆栈最终会增长并溢出)。我尝试了小到4x4的迷宫,但没有成功。你能帮助我吗? #被阻止,是免费的。为了增加允许的移动,增加或减少#定义移动(2)到#定义移动(4) #包括 #包括 #包括 #定义行(10) #定义列(10) int start_索引[]={0,0}; int

这是我对经典迷宫问题的解决方案。如果我只允许两个移动(向下或向右),并且只有这两个移动可以建立一条路径,那么它的工作就完美了。然而,如果我想允许所有4种可能的移动(向下、向右、向左、向上),程序永远不会给出解决方案(似乎递归堆栈最终会增长并溢出)。我尝试了小到4x4的迷宫,但没有成功。你能帮助我吗?
#
被阻止,
是免费的。为了增加允许的移动,增加或减少
#定义移动(2)
#定义移动(4)

#包括
#包括
#包括
#定义行(10)
#定义列(10)
int start_索引[]={0,0};
int end_索引[]={9,9};
//字符迷宫[R][C]={//无法使用4个允许的移动解决此迷宫
//     {'.','#','.','.','.','.','.','.','.','.'},
//     {'.','#','.','#','#','#','#','#','#','.'},
//     {'.','#','.','#','#','#','#','#','#','.'},
//     {'.','#','.','#','#','#','#','#','#','.'},
//     {'.','#','.','#','#','#','#','#','#','.'},
//     {'.','#','.','#','#','#','#','#','#','.'},
//     {'.','#','.','#','#','#','#','#','#','.'},
//     {'.','#','.','#','#','#','#','#','#','.'},
//     {'.','#','.','#','#','#','#','#','#','.'},
//     {'.','.','.','#','#','#','#','#','#','.'}
// };
字符迷宫[ROW][COL]={//可以用2个允许的移动解决此迷宫
{'.','.','#','.','.','.','.','.','.','#'},
{'#','.','.','.','.','.','.','.','.','.'},
{'#','.','#','.','.','.','.','.','.','.'},
{'#','.','#','.','.','.','.','.','.','.'},
{'.','.','.','.','.','.','.','.','#','.'},
{'.','.','#','.','.','.','.','.','.','#'},
{'#','.','.','.','#','#','.','.','.','.'},
{'#','.','#','.','.','#','.','.','.','.'},
{'.','.','#','.','.','#','.','.','#','.'},
{'.','.','#','.','.','.','.','.','.','.'}
};
char sol[行][列]={
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
{' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}
};
int move_x[]={0,1,0,-1};
int move_y[]={1,0,-1,0};
#定义移动(4)
布尔是安全的(整数x,整数y);
布尔是_目标(整数x,整数y);
布尔解_迷宫(intx,inty);
无效打印迷宫(布尔可解);
int main(){
printf(“\n开始”);
布尔可解=求解迷宫(开始索引[0],开始索引[1]);
印刷迷宫(可解);
printf(“\nEnd.”);
}
布尔解迷宫(整数x,整数y){
int next_x,next_y;
静态整数计数=0;
bool tmp_res=假;
溶胶[x][y]=';
printf(“\n%d:(%d,%d)”,count++,x,y);

对于(int i=0;i您应该在访问完单元格后立即标记它们(而不是在最后,就像您使用
sol[next_x][next_y]='#';
时,如果当前算法进入的单元格已经由堆栈下方的一个帧输入,导致某个无限循环,那么它将无法返回(从而导致堆栈溢出)

如果(sol[x][y]=''#')返回false;
则尝试将在
sol[x][y]='#')中执行的第一件事设置为
be
,第二件事设置为
sol[x][y]='#
。第一条语句:

if (sol[x][y]=='#') return false;
sol[x][y] = '#';
表示“如果此单元格已标记为已访问,则不要重新访问”。第二个语句:

if (sol[x][y]=='#') return false;
sol[x][y] = '#';

表示“将此单元格标记为已访问”。或者,您可以使用除
'#'
以外的其他字符将单元格标记为已访问。我不确定这是否是
'#'
所表示的(这似乎是为了表示不在通往出口的某条路径上的单元格,但实际上在可解迷宫中,所有可探索的单元格都在通往出口的某条路径上)。

您应该在访问完您访问过的单元格后立即对其进行标记(而不是像使用
sol[next_x][next_y]那样在最后标记)='#'
如果当前算法进入的单元格已经由堆栈下方的一个帧输入,导致某个无限循环(从而导致堆栈溢出),则无法返回

如果(sol[x][y]=''#')返回false;
则尝试将在
sol[x][y]='#')中执行的第一件事设置为
be
,第二件事设置为
sol[x][y]='#
。第一条语句:

if (sol[x][y]=='#') return false;
sol[x][y] = '#';
表示“如果此单元格已标记为已访问,则不要重新访问”。第二个语句:

if (sol[x][y]=='#') return false;
sol[x][y] = '#';
表示“将此单元格标记为已访问”。或者,您可以使用除
'#'
以外的其他字符将单元格标记为已访问。我不确定这是否是
'#'
所表示的(这似乎是为了表示不在某条通向出口的路径上的单元,但实际上在可解迷宫中,所有可探索的单元都在通往出口的某条路径上)