八皇后问题是十九世纪著名的数学家高斯于1850年提出的,并给出76组解。问题是:在8×8的棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。用计算机计算,共有92组解。可以把八皇后问题扩展到n皇后问题,即在n×n的棋盘上摆放n个皇后,使任意两个皇后都不能处于同一行、同一列或同一斜线上。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | /**************************************************************** * Description: N-queens problem * Author: Alex Li * Date: 2023-07-27 18:51:55 * LastEditTime: 2023-07-27 18:52:25 ****************************************************************/ #include <iostream> using namespace std; const int N=4; /* A utility function to print solution */ void printSolution(int board[N][N]){ for (int i = 0; i < N; i++) { for (int k = 0; k<N; k++) { cout<<board[i][k]; } cout<<"\n"; } } /* A utility function to check if a queen can be placed on board[row][column]. Note that this function is called when "column" queens are already placed in columns from 0 to col -1. So we need to check only left side for attacking queens */ bool isSafe(int board[N][N],int row,int column){ int i,j; /* Check this row on left side */ for (int i = 0; i < column; i++) { if(board[row][i])return false; } /* Check upper diagonal on left side */ for (int i = row, j=column; i >=0&&j>=0; i--,j--) { if(board[i][j])return false; } /* Check lower diagonal on left side */ for (int i = row, j =column;j>=0&&i<N; i++,j--) { if(board[i][j])return false; } return true; } /* A recursive utility function to solve N Queen problem */ bool solveNQUtil(int board[N][N],int column){ /* base case: If all queens are placed then return true */ if(column>=N) return true; /* Consider this column and try placing this queen in all rows one by one */ for(int i=0;i<N;i++){ /* Check if the queen can be placed on board[i][column] */ if(isSafe(board,i,column)){ /* Place this queen in board[i][column] */ board[i][column]=1; /* recur to place rest of the queens */ if(solveNQUtil(board,column+1)) return true; /* If placing queen in board[i][column] doesn't lead to a solution, then remove queen from board[i][column] */ board[i][column] = 0; // BACKTRACK } } /* If the queen cannot be placed in any row in this colum col then return false */ return false; } bool solveNQ(){ int board[N][N]={{0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0} }; if(solveNQUtil(board,0)==false){ cout<<"soution does not exist"; return false; }else{ printSolution(board); return true; } } int main() { solveNQ(); return 0; } |
洛谷:P1562 P2105