算法分类:
回溯
算法原理:
简单的深搜迭代
代码实现(北大百练 2698):
/* Author: jokes000
* 北大百练 2698
* 八皇后问题
*/
#include <stdio.h>
#include <string.h>
const int N = 8; // 棋盘大小
int C[N]; // 存储每个皇后所在位置
bool G[N][N]; // 用于输出中转换行列
int cnt;
bool isQualified(int column) {
// 确定所在行无皇后
for (int i = 0; i < column; ++ i) {
if (C[column] == C[i] && column != i)
return false;
}
// 确定对角线方向无皇后
for (int i = 0; i < column; ++ i) {
if (C[column] - C[i] == i - column || C[column] - C[i] == column - i) {
return false;
}
}
return true;
};
void output() {
int i, j;
printf("No. %d\n",++cnt);
memset(G, 0, sizeof(G));
for (i = 0; i < N; ++ i) {
G[C[i]][i] = true;
}
for (i = 0; i < N; ++ i) {
for (j = 0; j < N-1; ++ j)
printf("%d ",G[i][j]);
printf("%d\n",G[i][j]);
}
}
void Queens(int pos) {
for (int i = 0; i < N; ++ i) {
C[pos] = i;
if (isQualified(pos)) {
if (pos+1 < N) {
Queens(pos+1);
} else {
output();
}
}
}
};
int main()
{
// 初始化变量
memset(C, -1, sizeof(C));
cnt = 0;
Queens(0);
}