什么是八皇后问题
八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
问题表述为:在8×8的国际象棋格上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。
核心代码
//核心代码
void eightQueen(int r) {
//临界条件,有八个皇后时打印
if(r==8) {
sum++;//第几种方法
print();//打印
return;
}
for(int l=0;l<8;l++) {//遍历每一行
if(judge(r,l)) {
queen[r] = l;//放置皇后
eightQueen(r+1);//放置下一个皇后
}
}
}
判断该位置能否放皇后
//判断该位置能否放皇后
int judge(int r, int l) {
int left = l-1,right = l+1;//左边 右边
for(int i=r-1;i>=0;i--) {
//垂直方向有没有皇后
if(queen[i]==l) return 0;
//左上方有没有皇后
if(queen[i]==left&&left>=0) return 0;
//右上方有没有皇后
if(queen[i]==right&&right<8) return 0;
left--;
right++;
}
return 1;
}
打印
//打印
void print() {
printf("第%d种放法\n",sum);
for(int r=0;r<8;r++) {
for(int l=0;l<8;l++) {
if(queen[r]==l) printf("Q");
else printf("*");
}
printf("\n");
}
printf("\n\n");
}
完整代码
#include<stdio.h>
//八个皇后
int queen[8];
//记录有多少放法
int sum=0;
void eightQueen(int r);
int judge(int r, int l);
void print();
//核心代码
void eightQueen(int r) {
//临界条件,有八个皇后时打印
if(r==8) {
sum++;//第几种方法
print();//打印
return;
}
for(int l=0;l<8;l++) {//遍历每一行
if(judge(r,l)) {
queen[r] = l;//放置皇后
eightQueen(r+1);//放置下一个皇后
}
}
}
//判断该位置能否放皇后
int judge(int r, int l) {
int left = l-1,right = l+1;//左边 右边
for(int i=r-1;i>=0;i--) {
//垂直方向有没有皇后
if(queen[i]==l) return 0;
//左上方有没有皇后
if(queen[i]==left&&left>=0) return 0;
//右上方有没有皇后
if(queen[i]==right&&right<8) return 0;
left--;
right++;
}
return 1;
}
//打印
void print() {
printf("第%d种放法\n",sum);
for(int r=0;r<8;r++) {
for(int l=0;l<8;l++) {
if(queen[r]==l) printf("Q");
else printf("*");
}
printf("\n");
}
printf("\n\n");
}
int main() {
eightQueen(0);
}
仅展示部分。