C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

N-Queen問題を解決するためのC++プログラム


この問題は、チェス盤でN人の女王の配置を見つけて、女王がボード上の他の女王を攻撃できないようにすることです。

チェスの女王は、水平、垂直、水平、斜めの方法であらゆる方向に攻撃できます。

バイナリマトリックスは、クイーンが他のクイーンを攻撃できないNクイーンの位置を表示するために使用されます。ここでは、8つのクイーンの問題を解決します。

入力

チェス盤のサイズ。ここでは8です(8 x 8は通常のチェス盤のサイズです)。

出力

Nクイーンを配置できる行と列を表す行列。

ソリューションが存在しない場合は、falseが返されます。

1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0

この出力では、値1はクイーンの正しい場所を示しています。

0は、チェス盤の空白を示します。

アルゴリズム

isValid(board、row、col)

Begin
   if there is a queen at the left of current col, then
      return false
   if there is a queen at the left upper diagonal, then
      return false
   if there is a queen at the left lower diagonal, then
      return false;
   return true //otherwise it is valid place
End

solutioneNQueen(board、col)

Begin
   if all columns are filled, then
      return true
   for each row of the board, do
      if isValid(board, i, col), then
         set queen at place (i, col) in the board
         if solveNQueen(board, col+1) = true, then
            return true
         otherwise remove queen from place (i, col) from board.
      done
   return false
End

#include<iostream>
using namespace std;
#define N 4
void printBoard(int board[N][N]) {
   for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++)
         cout << board[i][j] << " ";
         cout << endl;
   }
}
bool isValid(int board[N][N], int row, int col) {
   for (int i = 0; i < col; i++) //check whether there is queen in the left or not
      if (board[row][i])
         return false;
   for (int i=row, j=col; i>=0 && j>=0; i--, j--)
      if (board[i][j]) //check whether there is queen in the left upper diagonal or not
         return false;
   for (int i=row, j=col; j>=0 && i<N; i++, j--)
      if (board[i][j]) //check whether there is queen in the left lower diagonal or not
         return false;
   return true;
}
bool solveNQueen(int board[N][N], int col) {
   if (col >= N) //when N queens are placed successfully
      return true;
   for (int i = 0; i < N; i++) { //for each row, check placing of queen is possible or not
      if (isValid(board, i, col) ) {
         board[i][col] = 1; //if validate, place the queen at place (i, col)
         if ( solveNQueen(board, col + 1)) //Go for the other columns recursively
            return true;
         board[i][col] = 0; //When no place is vacant remove that queen
      }
   }
   return false; //when no possible order is found
}
bool checkSolution() {
   int board[N][N];
   for(int i = 0; i<N; i++)
   for(int j = 0; j<N; j++)
   board[i][j] = 0; //set all elements to 0
   if ( solveNQueen(board, 0) == false ) { //starting from 0th column
      cout << "Solution does not exist";
      return false;
   }
   printBoard(board);
   return true;
}
int main() {
   checkSolution();
}

出力

1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0

  1. C++での友達ペアリングの問題

    この問題では、グループ内の友達の数を示す正の整数Nが与えられます。私たちの仕事は、FriendsPairingの問題を解決するためのプログラムを作成することです。 グループの各友達は、独身のままにすることも、他の1人の友達とペアにすることもできます。グループの各友達のペアリングは1回だけ実行できます。 問題を理解するために例を見てみましょう Input: n = 3 Output: 4 Explanation: Let’s say the 3 members of the group are A, B and C. The pairing can be done as :

  2. C++で部分的に満たされた数独グリッドを解決するためのプログラム

    部分的に塗りつぶされた数独グリッドがあり、これを解決する必要があるとします。数独は9×9の数字グリッドであり、グリッド全体も3×3のボックスに分割されていることがわかっています。数独を解決するためのルールがいくつかあります。 この問題を解決するには、1から9までの数字を使用する必要があります。 1行、1列、または1つの3×3ボックスで1桁を繰り返すことはできません。 バックトラッキングアルゴリズムを使用して、数独問題の解決を試みます。一部のセルが数字で埋められると、それが有効かどうかをチェックします。無効な場合は、他の番号をチェックします。すべての数字が1〜9でチェックされ、