八皇后问题是什么:
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
题解:
#include<iostream>
#include<math.h>
using namespace std;
int a[9] = {0};
int count = 0;
bool canPlace(int step, int pos) {
for(int i = 1; i < step; i++) {
if(a[i] == pos || abs(a[i] - pos) == abs(step-i))
return false;
}
return true;
}
void dfs(int step) {
if(step == 9) {
for (int i = 1; i <= 8; i++)
printf("%d ", a[i]);
printf("\n");
count++;
return;
}
for(int i = 1; i <= 8; i++) {
if(canPlace(step, i)) {
a[step] = i;
dfs(step+1);
a[step] = 0;
}
}
}
int main() {
dfs(1);
printf("%d", count);
}
解析:
数组a记录棋子摆放位置,例如a[3] = 5
表示在第三的第五格放了棋子,任意两个皇后都同一斜线上,意味着(a[step]-a[i])/(step-i) 的绝对值不能是1
,同一列好理解,a[step] != a[i],同一行不用考虑,因为我们一行只放一个棋子。