递归函数的优化
大家好,我正在做一个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);
}
对你的帮助太多了我堆叠了一个多星期大声笑。