您的位置:首页 > 编程语言 > C语言/C++

C语言经典面试题---八皇后问题

2018-03-13 17:35 453 查看
问题:1848年由一位国际象棋棋手提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,如何求解?思路:使用递归回溯的方法解决,所谓递归回溯,本质上是一种枚举法。这种方法从棋盘的第一行开始尝试摆放第一个皇后,摆放成功后,递归一层,再遵循规则在棋盘第二行来摆放第二个皇后。如果当前位置无法摆放,则向右移动一格再次尝试,如果摆放成功,则继续递归一层,摆放第三个皇后......如果某一层看遍了所有格子,都无法成功摆放,则回溯到上一个皇后,让上一个皇后右移一格,再进行递归。如果八个皇后都摆放完毕且符合规则,那么就得到了其中一种正确的解法(事实证明共有92中摆放方法)代码:#include<stdio.h>
#include<stdlib.h>
#include"eightQueen.h"

//定义皇后数量和棋盘大小
int queenNum = 8;
#define MAX_NUM 8
int chessBoard[MAX_NUM][MAX_NUM];

//检查当前位置的皇后是否合规(和任何皇后不在同一行/列/对角线)
//此处我们是每一行只放一个皇后所以不用检查行
int check(int x,int y){
int i,back;
for(i = 0;i < y;i++){
//检查列
if(chessBoard[x][i] == 1){
back = 0;
}
//检查左上对角线
if((x - 1 - i >= 0) && chessBoard[x - 1 - i][y - 1 - i] == 1){
back = 0;
}
//检查右下对角线
if(x + 1 + i < MAX_NUM && chessBoard[x + 1 + i][y + 1 + i] == 1){
back = 0;
}
}
back = 1;
return back;

}

//从第一行开始依次摆放,我们只需要确定y轴列数然后判断皇后位置合法性就行。
int eightQueen(int y){
int i,j,back;
if(y == MAX_NUM){
back = 1;
}
for(i = 0;i < MAX_NUM;i++){
//为当前行清零,避免回溯时出现脏数据
for(j = 0;j < MAX_NUM;j++){
chessBoard[j][y] = 0;
}
if(1 == check(i,y)){
chessBoard[j][y] = 1;
if(eightQueen(y + 1)){
back = 1;
}
}
}
back = 0;

//打印八皇后位置
int k,l;
for(k = 0;k < MAX_NUM;k++){
for(l = 0;l < MAX_NUM;l++){
printf("%d\n",chessBoard[k][l]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  八皇后问题