gpt4 book ai didi

algorithm - 计算矩阵中的最短距离

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:23:02 24 4
gpt4 key购买 nike

一个字符矩阵如下:

#########
#P......#
####..###
##P....##
#.......#
#########

如何求P与P之间的最短距离?距离定义为从 P 移动到 P 时的总步数。允许垂直或水平移动一步。在矩阵中,'#'代表你无法通过的障碍,'.'代表你可以通过的开放区 block 。

通过简单地对从 P 到 P 的矩阵进行 DFS 运算很容易找到距离。但是有没有更有效的方法来解决这个问题呢?

最佳答案

您可以确定目标的方向,并始终开始寻找该方向的路径。对于给定的简单矩阵,递归解决方案将立即找到路径,而不是让步。对于更复杂的矩阵,它当然可以被愚弄到死胡同,所以并行方法可能更好。

这是递归方法在 C# 中的样子:

public static int Distance(string[] matrix, int x, int y, int targetX, int targetY, int fromX, int fromY) {
// show where we are
Console.WriteLine(x + ", " + y);
// check for target
if (x == targetX && y == targetY) return 0;
// determine valid moves
List<Point> move = new List<Point> {
new Point(-1, 0),
new Point(1, 0),
new Point(0, -1),
new Point(0, 1),
};
move = move.Where(t => x + t.X != fromX || y + t.Y != fromY).ToList();
move = move.Where(t => matrix[y + t.Y][x + t.X] != '#').ToList();
// give up if we are in a dead end
if (move.Count == 0) return 1000;
// calculate direction towards target
double dirX = (targetX - x);
double dirY = (targetY - y);
double distance = Math.Sqrt(dirX * dirX + dirY * dirY);
dirX /= distance;
dirY /= distance;
// put moves towards the target first
move = move.OrderBy(t => Math.Abs(t.X - dirX) + Math.Abs(t.Y - dirY)).ToList();
// look for paths
foreach (Point p in move) {
int d = Distance(matrix, x + p.X, y + p.Y, targetX, targetY, x, y) + 1;
if (d < 1000) return d;
}
return 1000;
}

主要内容:

string[] matrix = new string[]{
"#########",
"#P......#",
"####..###",
"##P....##",
"#.......#",
"#########"
};

// find starting and ending points
List<Point> p = new List<Point>();
for (int y=0;y<matrix.Length;y++) {
for (int x=0;x<matrix[y].Length;x++) {
if (matrix[y][x] == 'P') {
p.Add(new Point(x,y));
}
}
}

// get distance
int d = Distance(matrix, p[0].X, p[0].Y, p[1].X, p[1].Y, -1, -1);
Console.WriteLine(d);

输出:

1, 1
2, 1
3, 1
4, 1
4, 2
4, 3
3, 3
2, 3
7

关于algorithm - 计算矩阵中的最短距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25960498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com