2017-11-09 2 views
1

現在、N-Queensの問題を解決しようとしています。具体的には、8x8ボードの8人の女王を対象としています。R:N-Queensに問題がある

最初の部分が問題です。最初は、クイーンが既に行列にあらかじめ割り当てられている場合に、その要素が安全かどうかを決定する関数"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) 

私はこれにはいくつかの問題を抱えています。私は、チェスのピースから行列の行、列と対角線の合計は< 1を返してTRUEを返すか、> 0より大きい場合はFALSEを返さなければならないことを理解しています。

これまでのところ、私が持っている:

>safe <- function(a,b){ 
    if((sum(b[a,])<1) & (sum(b[,a])<1)) 
    {return(TRUE) 
    }else{ 
    return(FALSE) 
    } 
} 

は、これは単に、行/列のためですが、それはTRUEあるべきとき、これは時々FALSEを返します。これは、チェスのピースがc(3,6)に設定され、マトリックス1が1,3に位置する場合などに発生します。それはチェスのピースから3を取り出し、それを誤った値のコラムに盛り込んでいるようです。なぜこれをやっているのですか?

次の部分は、チェスのピースの位置に基づいて、行列の対角線の合計をどのように合計したかです。これは本当に私を混乱させています。

私はかなり新しく、あなたの頭脳を選ぶことができるかどうか疑問に思っています。私は必ずしも直接的な解決策を望んでいませんが、正しい方向のいくつかのポインタが本当に私を助けてくれるでしょう。事前に

おかげで、Jim.S

答えて

1

インデックスxを忘れました。この機能を試してください:

safe <- function(x,y){ 
    if((sum(y[x[1],])<1) & (sum(y[,x[2]])<1)) 
    {return(TRUE) 
    }else{ 
    return(FALSE) 
    } 
} 
+0

ありがとうございました!本当に助けて!割り当てられたチェスピースから対角の和を見つける問題の解決法はありますか?本当にそれでも苦労して:) –

0

は、私は本当にRの側面に話すが、二つの王妃が同じ対角線上にあるかどうかを決定するという点で、それに気づくことができません。

  1. 2つのクイーンが同じ対角線上にある場合(/のように)、行と列の合計は常に等しくなります。

  2. 2つのクイーンが同じ後ろの対角線上にある場合(同じように)、行と列の差は常に等しくなります。