我想使用 A *算法找到case(n)和case(m)之间的距离,其中n!= m。 如何通过迷宫中的案例编号,高度和宽度找到x0,x1,y0和y1? 那是否有一个公式?
float distance(Maze* maze, int start, int end)
{
float x0 = ..??..
float x1 = ..??..
float y0 = ..??..
float y1 = ..??..
float dx = x0 - x1;
float dy = y0 - y1;
return sqrtf(dx*dx+dy*dy);
}
迷宫的例子:
<----------- width ------------->
case0 | case1 | case2 | case3 |
case4 | case5 | case6 | case7 | height
case8 | case9 | case10 | case11 |
答案 0 :(得分:1)
首先计算指数:
int x0 = m % width; // % = modulo operation
int y0 = m / width;
int x1 = n % width;
int y1 = n / width;
int dx = x1 - x0;
int dy = y1 - y0;
return sqrtf(dx*dx + dy*dy);
确保使用int
执行索引计算。 int-division截断小数。模运算返回除法的余数。 x % width
会产生0 .. width-1
范围内的值。
答案 1 :(得分:0)
从您的示例中,您可以获取元素的行和列,如下所示:
//for case(n)
int row_of_n = n / number_of_columns;
int column_of_n = n % number_of_columns;
同样找到case(m)
的坐标,然后应用毕达哥拉斯定理。
答案 2 :(得分:0)
假设你想要:
1:(0,0) | 2:(1,0) | 3:(2,0) | 4:(3,0) |
5:(0,1) | 6:(1,1) | 7:(2,1) | 8:(3,1) |
9:(0,2) | 10:(1,2) | 11:(2,2) | 12:(3,2) |
您可以通过
找到给定案例的x和yvoid find_coordinates(int case_number, &x, &y) {
*x = case_number % 4 - 1;
*y = case_number / 4;
if(*x==-1) *x=3;
if(*x==0) *y=*y-1;
}
答案 3 :(得分:0)
float x0 = (start % width);
float x1 = ( end % width);
float y0 = (start / width);
float y1 = ( end / width);
当开始/结束有效地将宽度缠绕到下一行时,y只是适合开始/结束的宽度数。 x是你减去y时剩下的东西。