八皇后问题(回溯)
2015-11-29 20:07
267 查看
[问题描述]
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
[解题思路]
从第1行第1个开始,遍历8*8格,当发现当前点在同一行、同一列或同一斜线上有相同的点就不取该点,遍历到第八行,摆法就加1,然后就回溯。
[代码实现]
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
[解题思路]
从第1行第1个开始,遍历8*8格,当发现当前点在同一行、同一列或同一斜线上有相同的点就不取该点,遍历到第八行,摆法就加1,然后就回溯。
[代码实现]
#include<stdio.h> int ans[8] = {0}; /*存放棋子在每行的位置*/ int Count = 0; void Print() { for(int i = 0; i <8; i ++) { for(int j = 0; j < 8; j ++) { if(j==ans[i]) { printf("# "); continue; } printf("* "); } printf("\n"); } printf("_____________________________________\n"); } int IsRepeat(int new_i, int new_j) { int j; for(int i= 0; i < new_i; i++) { j = ans[i]; if(new_j == j) /*竖*/ return 0; if((i + j) == (new_i + new_j)) /*右斜线*/ return 0; if((i - j) == (new_i - new_j)) /*左斜线*/ return 0; } return 1; } void dfs(int i) //i行 { if(i==8) { Count ++; Print(); return ; } for(int j = 0; j < 8; j++) /*第i行的第几j个*/ { if(IsRepeat(i, j)) { ans[i] = j; dfs(i + 1); ans[i] = 0; } } } int main() { dfs(0); printf("total = %d\n", Count); return 0; }
相关文章推荐
- Kettle通过Webservice获取天气信息
- 第十二周总结 第八章
- 函数重载、覆盖、多态
- linux下精髓命令---你都懂?
- Unix环境编程常用头文件
- EJB安全
- SQL server语句测试
- 闲话Zynq UltraScale+ MPSoC (连载2)——架构和电源要求
- 蓝桥杯OJ刷题日记——03-基础练习 字母图形
- Swift 面向对象
- 第八章 实践 运行代码
- leetcode Remove Element python
- PAT 1102. Invert a Binary Tree (25)
- hpuoj--校赛--与学妹滑雪(最短路+精度判断)
- 人工很贵的背后是什么?
- 在服务器上安装windows操作系统
- 实模式和保护模式
- Swift 语言函数
- hpuoj--校赛--与学妹滑雪(最短路+精度判断)
- 20135316王剑桥 linux第十一周课实验笔记