gpt4 book ai didi

c# - 二维矩阵中两个位置之间的最短路径

转载 作者:行者123 更新时间:2023-11-30 17:41:05 24 4
gpt4 key购买 nike

这是一个从索引[0,0] 寻找目的地的路径查找器的代码,例如值'9'。 BFS 或 DFS 应该比下面的算法做得更好吗?对于更好的算法来完成相同的任务有什么建议吗?

using System;

public class Test
{
public static int[,] matrix =
{
{1, 2, 8, 4},
{3, 0, 3, 4},
{4, 0, 2, 3},
{5, 0, 32, 9}
};

public static int[,] solution = new int[4,4];


public static void Main()
{
int rows = matrix.GetLength(0);
int cols = matrix.GetLength(1);

FindPath( matrix, 9, rows, cols);
// your code goes here
}

public static void FindPath(int[,] matrix, int destination, int rows, int cols)
{
bool[] visited = new bool[rows * cols];

for(int i=0; i < rows; i++ )
{
for(int j =0; j < cols; j++)
{
solution[i,j] = 0;
}
}

for(int i=0; i < rows*cols; i++ )
{
visited[i] = false;
}

CountPath(0, 0, visited, rows, cols, 9);


for(int i=0; i < rows; i++ )
{
for(int j =0; j < cols; j++)
{
Console.Write(" " + solution[i,j]);
}

Console.WriteLine("");
}
}

public static bool CountPath(int row, int col, bool[] visited, int rows, int cols, int destination)
{
if(row < 0 || row >= rows || col < 0 || col >= cols || visited[row * cols + col] || matrix[row,col] == 0)
{
Console.WriteLine("False...");
return false;
}
Console.WriteLine(matrix[row,col]);
Console.WriteLine(matrix[row,col]);


if(matrix[row,col] == destination)
{

solution[row, col] = matrix[row,col];
Console.Write("Found\n");
return true;
}

visited[row * cols + col] = true;
solution[row, col] = matrix[row,col];

Console.WriteLine(row);
Console.Write(col);
Console.WriteLine("-------------");

bool hasdestination = CountPath(row + 1, col, visited, rows, cols, destination) ||
CountPath(row , col + 1, visited, rows, cols, destination) ||
CountPath(row - 1, col, visited, rows, cols, destination) ||
CountPath(row , col - 1, visited, rows, cols, destination);

if(!hasdestination)
{
Console.WriteLine("No luck go back...");
solution[row, col] = 0;
return false;
}

return true;
}
}

最佳答案

您的算法似乎是一个简单的递归洪水填充搜索。它将搜索每个位置,然后检查所有周围的位置。您已经正确地为网格边缘和已经搜索到的位置实现了“提前退出”,看起来您正在将 0 的矩阵值视为“墙”,因为它们也会触发“提前退出”退出。

您提出这个问题的方式相当不合常规。您提到搜索值 9。这种类型的搜索大多与到达特定目标位置有关(例如,值 9 位于矩阵的位置 4,4),对于这种类型的搜索,A* 算法或 Dijkstra修改将在找到目的地之前搜索更少的位置。

原则上,您需要指定在这种情况下什么会“更好”?对于我提到的搜索类型的通常判断是,减少搜索位置的数量是“更好的”。但是,在某些情况下,代码简单性可能更重要,或者不需要知道路径是什么(正如您的示例似乎暗示的那样),有时您需要有保证的最短路径,有时您只想要一条合理的体面路径.这些案例中的每一个以及更多案例都经过了详细考虑!

您可能还想重新表述您的问题,因为您所做的并不是严格意义上的寻路。您提供的算法仅指示路径是否存在,而不指示该路径的步骤。

您的特定递归函数的扩展将导致它垂直向下搜索,直到它碰到墙壁或网格边缘。然后它将向右搜索一个方格,然后再次尝试向下移动。如果您打印出搜索到的位置,您很快就会明白我所说的这个特定算法将以一种非常古怪的方式进行搜索的意思,并且只对“恰好”出现在扩展模式早期的搜索目的地有效。

关于c# - 二维矩阵中两个位置之间的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33516715/

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