皇后问题简介
皇后问题,即是一个棋盘上,任两个皇后都不能处于同一条横行、纵行或斜线上
解决方法
在这里用1来表示棋盘上有皇后,0表示无皇后
过程:
定义一个二维数组,并对其进行处理,然后输出。即遍历所有的可能性,并且进行检测。
定义一个二维数组,并对其进行处理,然后输出。即遍历所有的可能性,并且进行检测。
递归思路:对于每一行,尝试每一个位置,检测如果安全,再进行下一行的处理
检测:实际从第一行开始,只需要其上一行进行检测。
如果在第i行,第j列,则需要对第i-1行的j-1,j,j+1列进行判断
检测:实际从第一行开始,只需要其上一行进行检测。
如果在第i行,第j列,则需要对第i-1行的j-1,j,j+1列进行判断
for(col = 0;col < CHESS_SIZE;col++){
chessBoard[row][col] = 1;
if(isSafe(chessBoard,row,col))
dealEightQeen(chessBoard,row+1);
chessBoard[row][col] = 0;
}
在这里如果不安全的话,该位置不再保留,如果没有
chessBoard[row][col] = 0;
则会出现2个1的情况,这是不允许的。
代码
#include<stdio.h>
typedef unsigned char Boolean;
typedef unsigned char uc;
#define CHESS_SIZE 8
#define TRUE 1
#define FALSE 0
void showChessBoard(uc chessBoard[CHESS_SIZE][CHESS_SIZE]);
Boolean isSafe(uc (*chessBoard)[CHESS_SIZE],int row,int col);
void dealEightQeen(uc (*chessBoard)[CHESS_SIZE],int row);
void dealEightQeen(uc (*chessBoard)[CHESS_SIZE],int row){
int col;
if(row >= CHESS_SIZE)//全部处理完之后输出
showChessBoard(chessBoard);
else
for(col = 0;col < CHESS_SIZE;col++){
chessBoard[row][col] = 1;
if(isSafe(chessBoard,row,col))
dealEightQeen(chessBoard,row+1);
chessBoard[row][col] = 0;
}
}
Boolean isSafe(uc (*chessBoard)[CHESS_SIZE],int row,int col){
Boolean safety = TRUE;
int i;
int j;
for(i = row - 1;safety && i >= 0;i--)//检测竖直向上的
if(chessBoard[i][col] != 0)
safety = FALSE;
for(i = row - 1,j = col -1;safety && i >= 0 && j >= 0;i--,j--)//检测左上
if(chessBoard[i][j] != 0)
safety = FALSE;
for(i = row - 1,j = col + 1;safety && i >= 0 && j < CHESS_SIZE ;i--,j++)//检测右上
if(chessBoard[i][j] != 0)
safety = FALSE;
return safety;
}
void showChessBoard(uc (*chessBoard)[CHESS_SIZE]){
int row;
int col;
static int count;
printf("这是%d个解\n",++count);//调用几次showChessBoard()函数,则有几个结果
for(row = 0;row < CHESS_SIZE;row++){
for(col = 0;col < CHESS_SIZE;col++)
printf("%d ",(int)chessBoard[row][col]);
printf("\n");
}
}
void main(void){
unsigned char eightQueen[CHESS_SIZE][CHESS_SIZE] = {0};
dealEightQeen(eightQueen,0);
}