八皇后问题

来源:互联网 发布:高分数据是什么 编辑:程序博客网 时间:2024/05/29 10:10

算法分类:

回溯


算法原理:

简单的深搜迭代


代码实现(北大百练 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);}