八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
一共有92种答案。
c代码实现如下:
- #include <stdio.h>
- #define SIZE 8
- static int board[SIZE][SIZE];
- void insertQueue(int row);
- void displayQueue();
- int checkConflict(int row,int col);
- int main(void){
- insertQueue(0);
- return 0;
- }
- //将皇后插入棋盘内
- void insertQueue(int row){
- int coli;
- for(coli=0;coli<SIZE;coli++){
- board[row][coli] = 1;
- if(checkConflict(row,coli)){
- if(row ==(SIZE-1)){
- displayQueue();
- }else{
- insertQueue(row+1);
- }
- }
- board[row][coli] = 0;
- }
- }
- //检查新插入皇后是否已现有的皇后有冲突
- int checkConflict(int row,int col){
- int rowi,coli;
- //检查与左上方的皇后是否有冲突
- if(row>0 && col>0){
- for(rowi=row-1,coli=col-1; rowi>=0 && coli>=0; rowi--,coli--){
- if(board[rowi][coli] == 1){
- return 0;
- }
- }
- }
- //检查与正上方的皇后是否有冲突
- if(row > 0)
- {
- for(rowi=row-1;rowi>=0;rowi--){
- if(board[rowi][col] == 1){
- return 0;
- }
- }
- }
- //检查与右上方的皇后是否有冲突
- if(row>0 && col<(SIZE-1)){
- for(rowi=row-1,coli=col+1; rowi>=0 && coli<SIZE; rowi--,coli++){
- if(board[rowi][coli] == 1){
- return 0;
- }
- }
- }
- return 1;
- }
- //将结果进行打印
- void displayQueue(){
- static count=1;
- printf("%d\n",count++);
- int i,j;
- for(i=0;i<SIZE;i++){
- for(j=0;j<SIZE;j++){
- printf("%d ",board[i][j]);
- }
- printf("\n");
- }
- printf("\n");
- }