八皇后问题(一)
2017-08-03 22:09
197 查看
//八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
//该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:
//在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,
//即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。
//1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
//计算机发明后,有多种计算机语言可以解决此问题
运行结果
//该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:
//在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,
//即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。
//1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
//计算机发明后,有多种计算机语言可以解决此问题
#include <stdio.h> #include <math.h> int iCount = 0; //记录解的序列号 int Queens[8]; //记录皇后在各列上的位置 void Output() //输出 { int i, j, flag=1; printf("第%2d种方案,(★代表皇后):\n",++iCount); printf(" "); for (i = 1; i <= 8; i++) printf("▁"); printf("\n"); for (i = 0; i < 8; i++) { printf(" |"); for (j = 0; j < 8; j++) { if (Queens[i] - 1 == j) //确定该位置是否为皇后 printf("★"); else { if (flag < 0) printf(" "); else printf("■"); } flag = -1 * flag; } printf("| \n"); flag = -1 * flag; } printf(" "); for (i = 1; i <= 8; i++) printf("▔"); printf("\n"); getchar(); } int IsValid(int n) //判断皇后是否形成攻击 { int i; for (i = 0; i < n; i++) //第n个皇后与 前面的n-1个比较 { if (Queens == Queens[i]) //判断两个皇后是否在同一行上 return 0; if (abs(Queens - Queens[i]) == n - i) //判断两个皇后是否在同一对角线上 return 0; } return 1; //没有冲突 } void Queen(int n) //第n列放置皇后 { int i = 8; if (n == 8) //放置成功 { Output(); //输出 return; } for (i = 1; i <= 8; i++) //在第n列的8行上进行探索 { Queens = i; //在该列上第i行上放置皇后 if (IsValid(n)) //没有冲突返回1,就开始下一步试探 Queen(n + 1); //没有冲突进行下一步递归 } } int main() { printf("八皇后的排序方案:\n"); Queen(0); //从第0列开始 getchar(); return 0; }
运行结果
相关文章推荐
- 递归-八皇后/N皇后问题
- 八皇后布局问题 -- 回溯法
- 多维算法思考(二):关于八皇后问题解法的探讨
- 八皇后问题
- 遗传算法解八皇后问题
- 面试题-八皇后问题[算法]
- 全排列方法求解八皇后问题
- 八皇后问题
- 全排列&&八皇后问题
- 八皇后的问题
- 字符串数组的全排列到八皇后问题详解
- 八皇后问题 - Python - from Python基础教程
- Python解决八皇后问题示例
- 八皇后问题 回溯法 C++ 含迭代器
- 八皇后问题
- 八皇后的问题 递归用法学习
- 八皇后问题最简单的解法
- 数据结构41:回溯法解决八皇后问题
- 程序员面试题精选100题(58)-八皇后问题[算法]
- 八皇后问题详细推导(递归和非递归,Go语言实现)