微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这个R版本的“骑士之旅”不起作用?

如何解决为什么这个R版本的“骑士之旅”不起作用?

我是R的新手,我试图找到从角落开始时骑士在棋盘上移动所需的最少移动次数

我从此网站使用了Python算法: https://www.geeksforgeeks.org/the-knights-tour-problem-backtracking-1/

并且我试图将其翻译为R。

但是,当我运行该程序时,其输出为:

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0   -1   -1   -1   -1   -1   -1   -1
[2,]   -1   -1   -1   -1   -1   -1   -1   -1
[3,]   -1   -1   -1   -1   -1   -1   -1   -1
[4,]   -1   -1   -1   -1   -1   -1   -1   -1
[5,]   -1   -1   -1   -1   -1   -1   -1   -1
[6,]   -1   -1   -1   -1   -1   -1   -1   -1
[7,]   -1   -1   -1   -1   -1   -1   -1   -1
[8,]   -1   -1   -1   -1   -1   -1   -1   -1
[1] "Minimum number of moves:  -1"

该如何解决此问题?

这是代码

chess = rep(-1,times = 64)
board = matrix(data = chess,nrow = 8,ncol = 8,byrow = TRUE)

move_x = c(2,1,-1,-2,2)
move_y = c(1,2,-1)
board[1,1] = 0
pos = 1

valid_move <- function (x,y,board) {
    if (x >= 1 && y >= 1 && x <= 8 && y <= 8 && board[x,y] == -1) {
        return (T)
    }
    return (F)
}   

solve <- function (board,curr_x,curr_y,move_x,move_y,pos) {
    
    if (pos == 64) {
        return (T)
    }
    for (i in seq(1,8)) {
        new_x = curr_x + move_x[i]
        new_y = curr_y + move_y[i]

        if (valid_move(new_x,new_y,board)) {
            board[new_x,new_y] = pos
            if (solve(board,new_x,(pos+1))) {
                return (TRUE)
            }
            board[new_x,new_y] = -1
        }
    }
    return (F)
}

main <- function() {
    sims = 10
    ctr = 0
    number_of_moves = c()

    solve(board,pos)



    for (x in board) {
        for (y in board) {
            number_of_moves <- c(number_of_moves,board[x,y])
        }
    }
    print(board)
    print(paste("Minimum number of moves: ",min(number_of_moves)))
}


main()

解决方法

在R中,当函数对其参数之一进行更改时,它仅对本地副本进行更改,而不对原始变量进行更改。

例如,在此R代码段中,我们可以看到该函数实际上并未修改变量l

try_to_modify <- function(l) l[[1]] <- -100

l <- list(1)
try_to_modify(l)
l
#> [[1]]
#> [1] 1

将此与python进行对比,它实际上在 修改了l

# (python code)
def try_to_modify(l):
  l[0] = -100

l = [1]
try_to_modify(l)
l
#> [-100]

如果您希望函数与调用者进行通讯,则它要么需要修改全局变量(通常不是最佳解决方案),要么需要使用返回值。 (有一些例外,但这通常是它的工作方式。)

因此,您可以返回TRUEFALSE,而不是返回boardNULL

valid_move <- function (x,y,board) {
  x >= 1 && y >= 1 && x <= 8 && y <= 8 && board[x,y] == -1
}

solve <- function (board,curr_x,curr_y,move_x,move_y,pos) {
  if (pos == 64) {
    return (board)
  }
  for (i in seq(1,8)) {
    new_x = curr_x + move_x[i]
    new_y = curr_y + move_y[i]
    
    if (valid_move(new_x,new_y,board)) {
      board[new_x,new_y] = pos
      result <- solve(board,new_x,(pos + 1))
      if (!is.null(result)) {
        return (result)
      }
      board[new_x,new_y] = -1
    }
  }
  # Return NULL
  # As this is the last result of the function,you don't need to write `return (NULL)`
  NULL
}
final_board <- solve(
  board = matrix(
    c(0,rep_len(-1,63)),nrow = 8,ncol = 8,byrow = TRUE
  ),curr_x = 1,curr_y = 1,move_x = c(2,1,-1,-2,2),move_y = c(1,2,-1),pos = 1
)

final_board
#>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#> [1,]    0   59   38   33   30   17    8   63
#> [2,]   37   34   31   60    9   62   29   16
#> [3,]   58    1   36   39   32   27   18    7
#> [4,]   35   48   41   26   61   10   15   28
#> [5,]   42   57    2   49   40   23    6   19
#> [6,]   47   50   45   54   25   20   11   14
#> [7,]   56   43   52    3   22   13   24    5
#> [8,]   51   46   55   44   53    4   21   12

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。