/*
八皇后问题:要在一个8*8的国际象棋几盘中放8个皇后,
使任意两个皇后都不能互相吃掉。规则是
皇后能吃掉偶同一行、同一列、统一对角
线的任意棋子,求所有的解
*/
#include<iostream>
#include<stdio.h>
using namespace std;
int a[21];
int n = 16;
bool check(int row);
void outputResult();
void eightQueue(int k);
long long times;// 次数
int main() {
// for (a[1] = 1; a[1] <= n; a[1]++) {
// for (a[2] = 1; a[2] <= n; a[2]++) {
// if (!check(2)) continue;// 如果当前位置不合适,继续往右挪
// for (a[3] = 1; a[3] <= n; a[3]++) {
// if(!check(3)) continue;
// for (a[4] = 1; a[4] <= n; a[4]++) {
// if (!check(4)) continue;
// printf("(1, %d) (2, %d) (3, %d) (4, %d)\n", a[1], a[2], a[3], a[4]);
// }
// }
// }
// }
// int k = 1;
// a[k] = 0;
// while (k) {
// a[k]++;// a[k]初始值为零,故刚开始要加一
// if (a[k] > n)// 如果突破了边界,说明上一个皇后的位置错误导致了
// k--; // 接下来的皇后无法放置,故这里需要调整上一个皇后的位置(也就是回溯)
// else {
// if (check(k)) {
// if (k == n) {// 若最后一个皇后放置完毕,输出当前放置方案
// outputResult();
// cout << endl;
// }
// else {
// k++;// 继续放置下一个皇后
// a[k] = 0;
// }
// }
// }
// }
eightQueue(1);
cout << times << endl;
return 0;
}
void eightQueue(int k) {// 递归实现
times++;
for (a[k] = 1; a[k] <= n; a[k]++) {
if (check(k)) {
if (k == n)// 假如到了最后一个皇后,就输出
outputResult();
else
eightQueue(k + 1);// 放置下一个皇后
}
}
}
bool check(int row) {
// 检查当前位置与前面的位置是否冲突
for (int i = 1; i < row; i++) {
if (a[i] == a[row] || a[i] - i ==
a[row] - row || a[i] + i == a[row] + row)
return false;
}
return true;
}
void outputResult() {
for (int i = 1; i <= n; i++)
cout << "(" << i << ", " << a[i] << ") ";
cout << endl;
}
八皇后问题
最新推荐文章于 2023-03-10 17:19:29 发布