r - 错误:下标越界(骑士之旅)
问题描述
我是 R 新手,我试图解决骑士访问棋盘中所有动作的最小移动次数。
我从以下网址获得了 python 代码: https ://www.geeksforgeeks.org/the-knights-tour-problem-backtracking-1/
我试着把它翻译成 r。
但我总是收到错误,我不知道我哪里出错了。
这是我的代码:
chess = rep(-1, times = 64)
board = matrix(data = chess, nrow = 8, ncol = 8, byrow = TRUE)
move_x = c(2, 1, -1, -2, -2, -1, 1, 2)
move_y = c(1, 2, 2, 1, -1, -2, -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, new_y, move_x, move_y, pos+1)) {
return (TRUE)
}
board[new_x, new_y] = -1
}
}
}
main <- function() {
sims = 10
ctr = 0
number_of_moves = c()
solve(board, 1, 1, move_x, move_y, pos)
print(paste("Minimum number of moves: ", pos))
}
main()
谢谢!
解决方案
问题是python代码依赖于短路来防止越界错误。&
不会短路,所以你需要使用&&
.
这是一个例子
FALSE && stop()
#> [1] FALSE
FALSE & stop()
#> Error:
更新valid_move
到这个
valid_move <- function (x, y, board) {
# Changed to && to allow short-circuiting
# if (x >= 1 & y >= 1 & x <= 8 & y <= 8 & board[x, y] == -1) {
if (x >= 1 && y >= 1 && x <= 8 && y <= 8 && board[x, y] == -1) {
return (T)
}
return (F)
}
推荐阅读
- java - 由于 CMD.exe 在我的系统中被限制,Surefire 插件无法分叉
- php - PHP:按降序和字母顺序对数组键进行排序
- kubernetes - 将循环部署到 Kubernetes
- python - 当它是日期时按字典中的值排序
- c# - 将日历值转换为 DateTime 会产生 InvalidCastException
- javascript - 如何将数据插入对象数组javascript
- symfony - 更改 Symfony 配置 TreeBuilder 的一部分
- gps - 在位置跟踪方面,如何考虑物联网传感器与 GPS 中的蜂窝、LoRaWAN 等协议?
- spring - xml Spring bean定义中的if语句
- sql - SQL-Developer 中的首选项仅适用于一列?