方法优化我的递归迷宫求解器?

时间:2012-01-26 08:29:04

标签: c optimization maze

我开发了以下C程序,以找到迷宫外的所有可能路径。它必须经过迷宫中的每个房间。这就是'54'在一分钟内被硬编码的原因,因为我传入的8 * 7阵列有54个开放的房间。我会解决这个问题并在我重写时动态传递它。但是我正在寻找一些如何使代码更有效的帮助 - 它找到了超过300,000条可能的路径来完成我传递的迷宫,但它运行了将近一个小时。

#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;
}  

1 个答案:

答案 0 :(得分:0)

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

其次,您可以在方框中解释这些值吗?如0,1,2和3? 3是迷宫的终点还是?...