八皇后问题(回溯)
来源:互联网 发布:吉林大学网络教育中心 编辑:程序博客网 时间:2024/05/16 13:58
[问题描述]
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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;}
1 0
- 八皇后问题 --回溯
- 回溯-八皇后问题
- 八皇后问题 回溯
- 八皇后问题(回溯)
- 八皇后问题 回溯
- 八皇后问题--回溯
- 回溯-八皇后问题
- 递归回溯--八皇后问题
- 回溯算法---八皇后问题
- 回溯算法-八皇后问题
- 八皇后问题 回溯法
- 八皇后问题 回溯法
- 八皇后问题(回溯)
- 八皇后问题(递归回溯)
- 八皇后问题回溯算法
- 八皇后问题 回溯法
- 八皇后问题-回溯法
- 八皇后问题|递归|回溯
- 创业漫话13(沟通和工作方式 下)
- cocos2d-x随笔-1
- 部署图&构件图
- poj 2393 - Yogurt factory
- 互联网 网站常见的攻击
- 八皇后问题(回溯)
- jquery ajax 多次提交问题
- 黑马程序员—java基础—集合框架
- 开发kettle插件 环境搭建
- java抢红包功能实现
- hpuoj--校赛--面试难题(区间相交问题)
- org.hibernate.MappingException: entity class not found: JPeople
- 语音识别-关键词检测
- ubuntu启动非常慢,报device descriptor read/64, error -110 的解决办法