R:遇到 N-Queens 问题
R: Having trouble with N-Queens
我目前正在尝试完成 N 皇后区问题。具体来说,它针对 8x8
棋盘上的 8 个皇后。
第一部分是问题。第一个是 "safe"
函数,用于确定当皇后已经预先分配在矩阵中时棋子是否安全。所以:
>chess.board <- matrix(data=0,8,8)
>chess.board[r,c] <- 1 #the r,c can be any row,column I choose
>chess.piece <- c(x,x) #the x,x could be for example two numbers that also represent a row and column
然后必须 运行 通过如下安全函数:
>safe(chess.piece,chess.board)
我遇到了几个问题。我知道 chess.piece 矩阵的行、列和对角线的总和应该是 < 1
到 return TRUE
或者如果它大于 > 0
它应该 return FALSE
.
到目前为止我有:
>safe <- function(a,b){
if((sum(b[a,])<1) & (sum(b[,a])<1))
{return(TRUE)
}else{
return(FALSE)
}
}
这仅适用于 row/column,但有时 return 是 FALSE
,而它应该是 TRUE
。例如,当 chess.piece 设置为 c(3,6) 并且矩阵 1 位于 1,3 时,就会发生这种情况。它似乎是从 chess.piece 中取出 3 并将其与 say 列中的错误值混为一谈。为什么要这样做?
下一部分是我到底如何根据 chess.piece 位置对矩阵的对角线求和。这让我很困惑。
我是 R 的新手,想知道我是否可以采纳你们的意见。我不一定想要直接的解决方案,但一些正确方向的指示确实可以帮助我。
提前致谢,Jim.S
R方面我真的不好说,但是在判断两个皇后是否在同一条对角线上,注意:
如果两个皇后在同一条正向对角线上(如 /),则行和列的总和将始终相等。
如果两个皇后在同一条后对角线上(如 ),则行和列之间的差异将始终相等。
您忘记为 x 编制索引。试试这个功能:
safe <- function(x,y){
if((sum(y[x[1],])<1) & (sum(y[,x[2]])<1))
{return(TRUE)
}else{
return(FALSE)
}
}
我目前正在尝试完成 N 皇后区问题。具体来说,它针对 8x8
棋盘上的 8 个皇后。
第一部分是问题。第一个是 "safe"
函数,用于确定当皇后已经预先分配在矩阵中时棋子是否安全。所以:
>chess.board <- matrix(data=0,8,8)
>chess.board[r,c] <- 1 #the r,c can be any row,column I choose
>chess.piece <- c(x,x) #the x,x could be for example two numbers that also represent a row and column
然后必须 运行 通过如下安全函数:
>safe(chess.piece,chess.board)
我遇到了几个问题。我知道 chess.piece 矩阵的行、列和对角线的总和应该是 < 1
到 return TRUE
或者如果它大于 > 0
它应该 return FALSE
.
到目前为止我有:
>safe <- function(a,b){
if((sum(b[a,])<1) & (sum(b[,a])<1))
{return(TRUE)
}else{
return(FALSE)
}
}
这仅适用于 row/column,但有时 return 是 FALSE
,而它应该是 TRUE
。例如,当 chess.piece 设置为 c(3,6) 并且矩阵 1 位于 1,3 时,就会发生这种情况。它似乎是从 chess.piece 中取出 3 并将其与 say 列中的错误值混为一谈。为什么要这样做?
下一部分是我到底如何根据 chess.piece 位置对矩阵的对角线求和。这让我很困惑。
我是 R 的新手,想知道我是否可以采纳你们的意见。我不一定想要直接的解决方案,但一些正确方向的指示确实可以帮助我。
提前致谢,Jim.S
R方面我真的不好说,但是在判断两个皇后是否在同一条对角线上,注意:
如果两个皇后在同一条正向对角线上(如 /),则行和列的总和将始终相等。
如果两个皇后在同一条后对角线上(如 ),则行和列之间的差异将始终相等。
您忘记为 x 编制索引。试试这个功能:
safe <- function(x,y){
if((sum(y[x[1],])<1) & (sum(y[,x[2]])<1))
{return(TRUE)
}else{
return(FALSE)
}
}