gpt4 book ai didi

c# - 得分最高的二维数组(板)最短路径

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:25:04 27 4
gpt4 key购买 nike

我正在开发一款带有二维阵列(游戏板)的新游戏。每个单元格/图 block 都有一定数量的点。

enter image description here

我想实现的是一个算法能找到核心最高的最短路径。

所以我首先实现了 Dijkstra 算法(下面的源代码)来找到从开始到结束(红色路线)的最短路径。这很好用。

我的问题是:如何扩展我的算法,以便它确定具有最高 分数的最短路径(因此是绿色路线)。

提前致谢!

class Graph
{
// Dictionary<Start Point, vertices>
Dictionary<char, Dictionary<char, int>> vertices = new Dictionary<char, Dictionary<char, int>>();

public void add_vertex(char name, Dictionary<char, int> edges)
{
vertices[name] = edges;
}

public List<char> shortest_path(char start, char finish)
{
var previous = new Dictionary<char, char>();
var distances = new Dictionary<char, int>();
var nodes = new List<char>();

List<char> path = null;

foreach (var vertex in vertices)
{
if (vertex.Key == start)
{
distances[vertex.Key] = 0;
}
else
{
distances[vertex.Key] = int.MaxValue;
}

nodes.Add(vertex.Key);
}

while (nodes.Count != 0)
{
nodes.Sort((x, y) => distances[x] - distances[y]);

var smallest = nodes[0];
nodes.Remove(smallest);

if (smallest == finish)
{
path = new List<char>();
while (previous.ContainsKey(smallest))
{
path.Add(smallest);
smallest = previous[smallest];
}

break;
}

if (distances[smallest] == int.MaxValue)
{
break;
}

foreach (var neighbor in vertices[smallest])
{
var alt = distances[smallest] + neighbor.Value;
if (alt < distances[neighbor.Key])
{
distances[neighbor.Key] = alt;
previous[neighbor.Key] = smallest;
}
}
}

return path;
}
}

更新:

我已经尝试过类似的方法,但似乎不起作用:

  foreach (var neighbour in _vertices[smallest])
{
// The variable alt is the length of the path from the root node to the neighbor node if it were to go through _vertices[smallest].
var alt = pointInfos[smallest].Distance + neighbour.Value.Distance;
var altScore = pointInfos[smallest].Points + neighbour.Value.Points;
if (alt <= pointInfos[neighbour.Key].Distance && altScore > pointInfos[neighbour.Key].Points) // A shorter path with higher points to neighbour has been found
{
pointInfos[neighbour.Key] = new PointInfo(alt, altScore);
previous[neighbour.Key] = smallest;
}
}

最佳答案

我不会在这里给出完整的增强答案,但我想我可以给你一个很好的提示,告诉你如何实现这一点。

您需要做的是将单元格中的分数用作图形的边长。转到下一个单元格需要 1 步或 100 步。

实现最长路径算法会更容易,因为你想最大化分数。问题是它会遍历整个棋盘。

enter image description here

所以你需要的是通过简单路线的负成本,所以它会尝试超过 100,但不会超过其余的负细胞。

enter image description here

您也可以使用最短路径算法来执行此操作,但随后您需要反转分数,以便它可以遍历得分最低的最短路径。

enter image description here

所以不要看你的算法的绝对长度,而是使用值作为长度来交叉。我希望这对您有所帮助,最终会让您得到一个不错的算法。

关于c# - 得分最高的二维数组(板)最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26955914/

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