优化递归函数

时间:2017-09-19 07:39:56

标签: c algorithm sorting recursion

递归函数的优化

大家好,我正在做一个npuzzle解算器,我有一个错误......

当启发式曼哈顿关闭时,我会使用默认顺序(顶部,底部,左侧,右侧)检查所有方式。当曼哈顿开启时,我选择了所有可能的最小距离。

示例:

ways[ 0].way =     Top .weight manhattan =  14
ways[ 1].way =    left .weight manhattan =  16
ways[ 2].way =  Botton .weight manhattan =  2147483647
ways[ 3].way =   right .weight manhattan =  2147483647 
weight manhattan =  15
   1   7   8
   4   2   0
   5   3   6

实际上,曼哈顿距离是15.如果0到达顶部,如果0向左移动,曼哈顿距离将为14和16。

我认为这部分没问题

我的错误在于函数general_weight。 (此函数调用每个节点)。当曼哈顿开启时,区别在于这段代码。如果曼哈顿距离已关闭grid->flag == 0其他grid->flag == 0x1u

static int          general_weight(t_grid *grid, int const flag,
        int const y_zero, int const x_zero, int const y_new, int const x_new,
        int weight)
{
    int                     y;
    int                     x;
    int                     ret;
    int                     ret1;
    int                     ret2;

    if (grid->flag == 0)
        return (flag);
    if (get_coord_value(grid->grid[y_new][x_new], grid->x_y, &y, &x) <= 0)
        return (INT_MIN);
    ret1 = (y > y_zero) ? y - y_zero : y_zero - y;
    ret2 = (x > x_zero) ? x - x_zero : x_zero - x;
    ret = weight;
    if ((grid->flag & F_MANHATTAN) != 0)
    {
        ret += ret1 + ret2;
        ret -= (y > y_new) ? y - y_new : y_new - y;
        ret -= (x > x_new) ? x - x_new : x_new - x;
    }
    ...
    return (ret);
}

我不明白这个时间会有多么不同。当曼哈顿在1.45 ...秒时解决网格问题,以及何时关闭1.01秒......

您是否了解问题所在?

我不是来自get_coord_value

int                         get_coord_value(int const value, int const x_y,
        int *y, int *x)
{
    static t_coord          coord_dest[SIZE_file_MAX * SIZE_file_MAX];
    static int              loop = 0;

    if (y == NULL || x == NULL || value >= SIZE_file_MAX * SIZE_file_MAX)
        return (-1);
    if (loop == 0)
    {
        for((*y) = 0; (*y) < x_y; (*y)++)
            for (*x = 0; *x < x_y; (*x)++)
                if (x_y == 3)
                {
                    coord_dest[g_grid_3x3[*y][*x]].y = (*y);
                    coord_dest[g_grid_3x3[*y][*x]].x = (*x);
                }
                else if (x_y == 4)
                {
                    coord_dest[g_grid_4x4[*y][*x]].y = (*y);
                    coord_dest[g_grid_4x4[*y][*x]].x = (*x);
                }
                else if (x_y == 5)
                {
                    coord_dest[g_grid_5x5[*y][*x]].y = (*y);
                    coord_dest[g_grid_5x5[*y][*x]].x = (*x);
                }
        loop = 1;
    }
    (*y) = coord_dest[value].y;
    (*x) = coord_dest[value].x;
    return (true);
}

对你的帮助太多了我堆叠了一个多星期大声笑。

0 个答案:

没有答案