【问题标题】:Finding minimum value within adjacent locations of array在数组的相邻位置内查找最小值
【发布时间】:2018-04-10 07:39:26
【问题描述】:

我是编码新手,两个多月没有编码了。 对于我的任务,我正在逃离迷宫算法。 用户定义了一个二维数组和一个起点,然后程序必须采取破坏性最小的路线才能找到出路。 “AI”只能向北、向东、向南或向西移动。它可以从数组的任何边缘逃逸。

Enter the starting x coordinate: 2 
Enter the starting y coordinate: 4 
0 1 4 2 6 0 1  
1 7 4 2 2 6 0  
0 0 0 8 * 4 1  
1 1 2 7 3 4 2  
5 1 6 4 2 2 1   

在此示例中,用户已选择 [2,4] 作为数组的起始位置(请记住,索引从 0 开始)。 AI 可以从阵列的任何边缘逃脱。它将要为每个动作选择最小的整数。在本例中,AI 将向上移动 2,然后向左,然后向上。因此,总共需要“6点伤害”才能退出阵列。

我的问题是比较北方是否小于东方,如果北方小于东方,它是否小于西方?还是南方?如果东方小于北方,它是否小于西方?还是南方? & 等等等等。 我不确定我是否以正确的方式处理这个问题。 我的尝试可以在下面的 hastebin 链接的第 44 - 78 行找到。 我不知道我在做什么。

我创建了一个int minimumValue;,但我不确定如何使用它,或者在哪里使用它。如果boardArray[north][currentY] < boardArray[east][currentY] 那么boardArray[north][currentY] 我的新最小值是否正确?然后我还需要编写代码将其与西部和南部进行比较。我觉得必须有一个更简单的方法来解决它。

我尝试了谷歌搜索解决方案、Reddit、The Coding Den discord 服务器,但我根本无法解决这个问题。

我们将不胜感激!

https://hastebin.com/acopoborut.java

【问题讨论】:

  • 什么是“破坏性最小的路线”以及如何比较“北方是否小于东方”?问题的定义不明确。
  • 欢迎来到 Stackoverflow。阿法辛说的是真的。您的问题定义不清楚。使用您在评论部分发布的详细信息更新您的答案。另外,在定义问题本身时发布您认为重要的代码 sn-ps,就像您在第 44 到 78 行所说的那样。这将帮助其他人快速完成您迄今为止尝试过的事情。
  • 你还没有解释“破坏最小的路线”是什么意思,从哪里到哪里的路线?入口点在哪里,出口点在哪里?你如何确定它们。正如 Sajib 所写:请改进帖子本身 not 在 cmets 部分中对问题的描述。如果您不费心使您的问题易于理解和跟进,人们将不会费心帮助您...帮助我们帮助您!
  • 我已经编辑了我的原始帖子!我道歉。我希望我这次解释得更好。

标签: java arrays algorithm multidimensional-array maze


【解决方案1】:

我假设说北是指 -y 方向,东是指 +x 方向

如果boardArray[x][y]代表坐标(x,y),那么它的北坐标应该是(x,y-1),东坐标是(x+1,y)。你可以这样比较它们

boardArray[x][y-1] < boardArray[x+1][y] //Is North smaller than East?

当然要先检查北东是否都在数组内,否则会得到ArrayIndexOutOfBoundException

【讨论】:

  • 啊是我的 N/E/S/W 参数倒退吗?我很抱歉。我的印象是 x+-1 对应于上下。好的,所以我正确地进行了比较。但是,当北不小于东时会发生什么?我不需要另一行代码来询问 if(boardArray[x+1][y] &lt; boardArray[x][y-1] 吗?这不是多余的吗?有捷径吗?
  • 如果您使用if-else 语句检查“north=east”将落入else 块。在您的问题中,您只是说您将继续比较北与西和南,但您没有提及如果“north>=east”会发生什么
  • 还有东应该是boardArray[currentX][east]而不是boardArray[east][currentY],因为你把y轴设为西和东
  • 它只需要选择最小值,这就是我试图比较所有内容的原因。有没有一种简单的方法可以同时查看“当前位置”周围的所有 4 个值,然后选择最小的一个?我觉得我这样做的方式很难。我这样做的方式,我需要 15-20 个 if-else 语句。 :/当北> =东落入else块时,我必须在那个else块中有一个if else来与南或西进行比较,然后在嵌套的else中使用另一个if else来比较最终方向。也再次感谢您,很好地了解 [x][east]。
  • 利用你的minimumValue:如果你从北开始,你可以把它设置为北,并与其他3个方向一一比较。如果下一个方向更小,则将minimumValue设置为该方向,否则保持。这是找到最小值/最大值的直接方法。
【解决方案2】:

神圣嵌套的别人的蝙蝠侠!

我会将第 55-78 行替换为以下内容:

//find the least danger:
int leastDanger = northDanger;
if(southDanger < leastDanger) leastDanger = southDanger;
if(eastDanger  < leastDanger) leastDanger = eastDanger;
if(westDanger  < leastDanger) leastDanger = westDanger;
// Go the first direction equal to least danger 
if      (northDanger == leastDanger) { moveNorth
}else if(southDanger == leastDanger) { moveSouth
}else if(eastDanger  == leastDanger) { moveEast
}else if(westDanger  == leastDanger) { moveWest
}

moveDirections 就是你的代码

visitedPath = visitedPath + "[" + currentX + "," + currentY + "]";    

危险值就是你的代码

boardArray[north][currentY]

如果你知道的话,也可以使用 switch 语句来完成。

【讨论】:

  • 这是 20 分钟后到期的,我花了太长时间来咨询 Stackoverflow,所以我最终只能获得部分功劳。但是,为了我自己的学习,我仍然想完成这个。现在,我最初完全考虑将我的 minValue (leastDanger) 设置为 Integer.MAX_VALUE,但是如果有人测试边缘情况决定他们想在他们的数组中输入荒谬的整数怎么办?当northDanger 和eastDanger 是同一个整数时会发生什么?
  • 从 Integer.MAX_VALUE 开始是个好主意。用户将无法在数组中输入大于该值的荒谬值。如果如上编码,它将采用与最小危险匹配的第一个方向。因此,如果northDanger 和eastDanger 都等于leastDanger,它将向北。
  • 我明白了。谢谢!我会试着从这里弄清楚。我非常感谢!如果这没有像现在我脑海中浮现的那样,可能会报告。
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 2013-09-13
  • 2021-05-02
  • 2015-10-08
  • 1970-01-01
相关资源
最近更新 更多