2016-04-03 10 views
0

nxn booleanのfalses配列をとり、答えを記入する関数を定義することにより、n-queenの問題(nxnボードにnxnボードを置くことなく、2人のクイーンをお互いに攻撃する)を解決しようとしています。クイーンズがどこにあるべきか真実と一緒に。私は間違った答えを得ていますが、なぜ再帰が機能しないのか分かりません!Nクイーン再帰プログラム

bool check(bool ** board, int n, int row, int col){ 
    if(row == 0) return true; 
    for(int r = 0 ; r < row ; ++r){ 
    if(board[r][col]) return false; 
    int left = max(col - row + r, 0), right = min(col + row - r, n-1); 
    if(board[r][left] || board[r][right]) return false; 
    } 
    return true; 
} 


bool queen(bool ** board, int n, int level = 0){ 
    for(int col = 0 ; col < n ; ++col){ 
    if(!check(board, n, level, col)) continue; 
    board[ level ][ col ] = true; 
    if(level == n-1) return true; 
    if(queen(board, n, level+1)) return true; 
    board[ level ][ col ] = false; 
    } 
    return false; 
}  

in main()iはbool ** boardを動的に作成し、それをfalseにしてからqueen(board、n)を呼び出します。

奇妙なことは、n = 4,6以外の正しい解決策を提供しているということです!

ご協力いただきありがとうございます。

答えて

1

あなたの不具合は最小/最大です。操作、直線を確認しないでください。 これは、このトリックを行う必要があります:

int left = col - row + r; 
int right = col + row - r; 

    if (left >= 0 && board[r][left] || right < n && board[r][right]) 
      return false; 
+0

これは実際に今働きました!しかし、私はmin maxの問題は何かを理解していません。なぜなら、ボードの境界を離れず、条件文と同じ仕事をしてくれるからです。 –

+0

ボードの端に達すると、列:[1,3]で始まり、[0,2]、[0,1]、[0,0]をチェックします。それは私が直線をチェックしていないことを意味したことは何ですか... – Turo

+0

それは感謝します、ありがとう! –