Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何优化我的递归迷宫解算器?_C_Optimization_Maze - Fatal编程技术网

C 如何优化我的递归迷宫解算器?

C 如何优化我的递归迷宫解算器?,c,optimization,maze,C,Optimization,Maze,我开发了下面的C程序来寻找迷宫中所有可能的路径。它必须穿过迷宫中的每个房间。这就是为什么“54”在此时被硬编码的原因,因为对于我要经过的8*7阵列,有54个开放的房间。我将计算出这个问题,并在重新编写时动态地传递它。然而,我正在寻找一些如何使代码更有效的帮助-它找到了超过300000条可能的路径来完成我正在经历的迷宫,但它运行了近一个小时 #include <stdio.h> #define FALSE 0 #define TRUE 1 #define NROWS 8 #defin

我开发了下面的C程序来寻找迷宫中所有可能的路径。它必须穿过迷宫中的每个房间。这就是为什么“54”在此时被硬编码的原因,因为对于我要经过的8*7阵列,有54个开放的房间。我将计算出这个问题,并在重新编写时动态地传递它。然而,我正在寻找一些如何使代码更有效的帮助-它找到了超过300000条可能的路径来完成我正在经历的迷宫,但它运行了近一个小时

#include <stdio.h>

#define FALSE 0
#define TRUE 1
#define NROWS 8
#define MCOLS 7

// Symbols:
//  0 = open
// 1 = blocked
// 2 = start
// 3 = goal
// '+' = path

char maze[NROWS][MCOLS] = {

    "2000000",
    "0000000",
    "0000000",
    "0000000",
    "0000000",
    "0000000",
    "0000000",
    "3000011"

};

int find_path(int x, int y, int c, int *t);

int main(void)
{   

    int t = 0;

    if ( find_path(0, 0, 0, &t) == TRUE )
        printf("Success!\n");
    else
        printf("Failed\n");

    return 0;

}

int find_path(int x, int y, int c, int *t)
{
    if ( x < 0 || x > MCOLS - 1 || y < 0 || y > NROWS - 1 ) return FALSE;

    c++;
    char oldMaze = maze[y][x];

    if ( maze[y][x] == '3' && c == 54) 
    {
        *t = *t+1;
        printf("Possible Paths are %i\n", *t);
        return FALSE;
    }

    if ( maze[y][x] != '0' && maze[y][x] != '2' ) return FALSE;

    maze[y][x] = '+';

    if ( find_path(x, y - 1, c, t) == TRUE ) return TRUE;

    if ( find_path(x + 1, y, c, t) == TRUE ) return TRUE;

    if ( find_path(x - 1, y, c, t) == TRUE ) return TRUE;

    if ( find_path(x, y + 1, c, t) == TRUE ) return TRUE;

    maze[y][x] = oldMaze;   
    return FALSE;
}  

首先,我没有看到函数返回TRUE的任何基本条件,它只在递归调用自身时返回TRUE,也就是说它将返回TRUE。结果将始终打印失败。我认为递归必须有一个基本条件,即当找到成功时,将向上传播


第二,你能解释一下方框中的数值吗?在0,1,2和3中?3是迷宫的终点还是?…

这更像是一个算法问题,而不是一个C编程问题。你读过好的算法书和专门的算法书吗?不是真的-我应该研究一种不同的迷宫求解算法而不是递归算法吗?一些更好的迷宫求解算法可能也是递归的…你是在试图尽快找到一条合法的路径吗?或者,您是否正在尝试尽快找到可能的路径数?这两个问题的算法是完全不同的。我试图尽快找到穿过每个房间的所有可能路径。是的,很抱歉,在打印行之后,可能路径是…等等,它应该是返回真的。至于我要经过的迷宫阵列,上面有符号注释。”2“是开始。”3“完成了。”1'是无法通过的被阻止的房间,0是开放的房间,成功的路径必须全部通过,即54个房间