堆栈上的愚蠢人

问题描述 投票:0回答:3

不值得在堆栈上发帖

stack
3个回答
0
投票

您与错误的变量进行比较:

while (energy > 0) { // Condition always true
  when {
    lightX > initialTx && lightY == initialTy -> {
      ...

...应该是:

while (energy > 0) { // Condition always true
  when {
    lightX > moveX && lightY == moveY -> {
      ...

...所有其他情况等等。然后代码就可以正常运行了。

较短的版本(并按 x 轴分组):

var energy = 100
val lightX = kotlin.random.Random.nextInt(0, 41)
val lightY = kotlin.random.Random.nextInt(0, 19)
val initialTx = kotlin.random.Random.nextInt(0, 41)
val initialTy = kotlin.random.Random.nextInt(0, 19)

println("Start: ($initialTx, $initialTy)")
println("End: ($lightX, $lightY)")

var moveX = initialTx
var moveY = initialTy

while (0 < energy--) {
  when {
    lightX < moveX  -> {
      moveX--
      when {
        lightY < moveY  -> moveY--.also { println("NW -> ($moveX, $moveY)") }
        lightY == moveY ->                println("W  -> ($moveX, $moveY)")
        lightY > moveY  -> moveY++.also { println("SW -> ($moveX, $moveY)") }
      }
    }
    lightX == moveX -> when {
      lightY < moveY  -> moveY--.also { println("S  -> ($moveX, $moveY)") }
      lightY == moveY -> break          // We arrived
      lightY > moveY  -> moveY++.also { println("N  -> ($moveX, $moveY)") }
    }
    lightX > moveX  -> {
      moveX++
      when {
        lightY < moveY  -> moveY--.also { println("NE -> ($moveX, $moveY)") }
        lightY == moveY ->                println("E  -> ($moveX, $moveY)")
        lightY > moveY  -> moveY++.also { println("SE -> ($moveX, $moveY)") }
      }
    }
  }
}

0
投票

由于

initialTx
initialTy
的值未更新,因此“NE”和“NW”情况的条件始终为真。这可能会导致无限循环。

可以更新“NE”和“NW”情况的条件,以包括对

initialTy > lightY
的检查,如下所示:


lightX > initialTx && lightY < initialTy && initialTy > lightY -> { /* Condition is always true when reached */
//...
            }

lightX < initialTx && lightY < initialTy && initialTy > lightY -> { /* Condition is always true when reached */
//...
            }

条件始终为真,因为

initialTy
被初始化为随机,它总是小于
lightY
,这也是随机数字。

  • 这样就可以避免无限循环,因为只有当initialTy高于lightY时才能满足要求。

-1
投票

问题出在“NE”和“NW”方向的条件上。正如您所指出的,这些条件始终为真,这会导致循环永远持续下去。

你必须改变这一行:

lightX > initialTx && lightY < initialTy -> {
    println("NE")
    initialTx++
    initialTy--
    println("Continue: ($initialTx, $initialTy)")
}
lightX < initialTx && lightY < initialTy -> {
    println("NW")
    initialTx--
    initialTy--
    println("Continue: ($initialTx, $initialTy)")
}
© www.soinside.com 2019 - 2024. All rights reserved.