不能让一个寻路算法在所有情况下都正确工作



我在一个关于在网格中找到最短总路径的任务中遇到了麻烦,同时以正确的顺序访问所有正确的瓷砖。

我们应该模拟手动输入一个单词,就像使用控制器写东西一样,并找到这样做所需的最少的命令(上,下,左,右)。

我们的输入是网格、参数和我们要处理的单词。我像这样存储它们(使用示例输入):

Height = 2;
Width = 2;               
Content = "ABCC";
Word = "ABC";
grid = new char[Height, Width];
Contents = Content.ToCharArray();
Words = Word.ToCharArray();
int ch = 0;
for (int i = 0; i < Height; i++)
{
for (int j = 0; j < Width; j++)
{
if (ch < Contents.Length)
{
grid[i, j] = Contents[ch];
ch++;
}
}
}

我计算最短路径的实际方法是这样的:

public void GridSearch( int a, int FirstX, int FirstY, int PathLength)
{
int NewPath;
int NewX;
int NewY;
int SecondX = 0;
int SecondY = 0;    
for (int i = 0; i < Height; i++)
{
for (int j = 0; j < Width; j++)
{
if (grid[i, j] == Words[a])
{
SecondX = i;
SecondY = j;
NewPath = PathLength;
NewPath += Math.Abs(FirstX - SecondX);
NewPath += Math.Abs(FirstY - SecondY);
NewX = SecondX;
NewY = SecondY;
if (a < Words.Length-1)
{
GridSearch(a+1, NewX, NewY, NewPath);
}
else
{
if (FinalPath > NewPath ^ FinalPath == -1)
{
FinalPath = NewPath;
}
}
}
}
}

我们也应该"点击";当在正确的瓷砖上时,所以我添加了"Words"到命令的总数。在这种情况下,字母之间的最短路径是2(右,下),长度是3,所以5是正确答案。

这也是我的程序得到的,但是当我试图发送它时,自动检查器说它只传递了5中的1。

遗憾的是,它没有说它用来使我的程序失败的输入,经过一天的尝试,我对如何修复它的想法,有没有人可以指出,毫无疑问,我正在做的明显的错误,并帮助我修复这个程序?

编辑:写好的作业说明(因为评论者要求):

一些设备允许使用字母网格输入文本。网格包含一个可移动光标,从左上角开始。方向键移动光标上、下、左、右和回车键选择光标下的字母。

例如,如果输入网格看起来像这样:

ABCDEFGH

IJKLMNOP

QRSTUVWX

YZ

我们可以输入文本"HELLO"使用以下键序列(这只是许多可能的序列之一):

输入左

输入下

输入

输入

输入为给定的网格(可以同时包含两者)编写一个程序小写和大写字母)和文本(其中也可能包含非字母字符)确定并写出最小值输入给定文本所需的按键数。

注意:每个字母可能在网格中出现不止一次!

输入以数字开头,表示字符的宽度和高度网格(每个在自己的行上)。

后面一行包含整个网格的内容行主顺序,即一行接一行)。

其余行包含要输入的文本。! 你应该忽略文本中没有出现在网格中的任何字符。

的例子:输入:

3

3

ABCBFECDF

ABCDEFA

输出:

15在这个例子中,网格的形式是

ABC

BFE

描绘洪涝频发它强调

可以通过多种方式输入文本ABCDEFA;15按键的长度是其中最短的。

修改我之前的答案,很可能你没有计算"进入"。击键。也就是说,你应该给每个字母的候选路径长度加一个:

...
NewY = SecondY;
**NewPath++;**
if (a < Words.Length - 1)
...

这在你的示例集"ABCBFECDF"上给出了15个正确的按键长度/"ABCDEFA".

请注意,这种类型的代码极大地受益于表示一对x/y坐标的类型,如PointVector2i,因此您不必为x和y坐标重复一堆计算。我还建议遵循常见的编码约定,如

  • 在尽可能小的范围内声明局部变量,而不是在方法的顶部
  • 使用"camelCasing"对于局部变量
  • 尽可能使用纯方法,即

我仍然建议阅读Djikstra或A*,因为它们应该更普遍适用,更有效。

相关内容

最新更新