每天一道算法题(36)——8皇后问题
来源:互联网 发布:网络运维培训 编辑:程序博客网 时间:2024/05/23 17:58
题目
要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的棋子。求一种解法。
思路
(1)递归法。以列数为状态,每一行的棋子共有8种状态。对每一棋子,依次遍历8种状态,在符合规则的状态下进行递归。
(2)深度优先遍历法。类似于递归法,对于每一层棋子,倘若符合规则,则前进;不符合规则且状态已经不能更新,则回溯,若状态还能更新,则更新状态。
在符合规则的情况下,若找出一种解,则打印该解,并且回溯。每一次回溯,均需要使用循环返回最顶层那个还能更新状态的棋子,并更新该棋子的状态。
代码:
public class eightQueen {int N;int[] index;int solution;eightQueen(int n){N=n;index=new int[N];for(int i=0;i<N;i++)index[i]=0;solution=0;}public boolean decision(int in){//判决,不在同一行和同一列和不在对角线上for(int i=0;i<in;i++) { if(Math.abs(index[i]-index[in])==Math.abs(i-in) || index[i]==index[in]) return false; }return true;}public void print(){//打印System.out.println("Solution:"+solution+"----------------------");for(int i=0;i<N;i++){for(int k=0;k<N;k++)if(k==index[i])System.out.print(1);elseSystem.out.print(0);System.out.print('\n');}}public void find1(int i){//递归法解决八皇后问题for(int j=0;j<N;j++){index[i]=j;if(decision(i)){if(i==N-1){solution++;print();}else find1(i+1);}}}public void find2(){//深度遍历之回溯法解决八皇后问题int i=0;while(i>=0){if(decision(i)){//确定当前节点的状态是否满足if(i==N-1){solution++;print();/*************找到一个解,回溯***************/index[i]=0;i--;while(i>=0&&index[i]==N-1){ index[i]=0; i--;//回溯}if(i>=0)index[i]++;//更新最上一层还可以更新状态的节点的状态}else{//前进过程i++;}}else if(index[i]==N-1){//某个节点的状态已经无法更新,回溯while(i>=0&&index[i]==N-1){//回溯至最上一层的点 index[i]=0; i--;}if(i>=0)index[i]++;////更新最上一层还可以更新状态的节点的状态 }else//节点状态更新index[i]++; } }}
解析:当前节点状态是否满足:
满足:是到到达最后一层,输出,并回溯至能更新状态的最近一层
没有到达最后一层,更新至判断下一层
不满足且当前层状态已经无法更新:
更新至能更新的最近一层
不满足且当前曾状态还能更新
更新状态。
8皇后问题共有92种解法
0 0
- 每天一道算法题(36)——8皇后问题
- 每天一道算法题——每天一道算法题
- 每天一道算法题(23)——约瑟夫环问题
- 每天一道算法题(34)——背包问题
- 每天一道算法题——汉诺塔
- 每天一道算法题——
- 每天一道LeetCode-----n皇后问题
- 【每天一道算法题】
- 【每天一道算法题】
- 【每天一道算法题】
- 每天一道算法题(19)——最近公共父节点问题
- 每天一道算法题(16)——翻转链表
- 每天一道算法题(22)——扑克牌的顺子
- 每天一道算法题(31)——正数减法
- 每天一道算法题——求全排列
- 每天一道算法题——奇偶数划分
- 每天一道算法题——Leecode.386. Lexicographical Numbers
- 每天一道算法题——数组重排序
- sqlite的优缺点
- 知乎上摘录的书单
- 关于Android开发中布局文件中各种值的设置存放的个人观点(按照布局文件来进行存放value值)
- C++ 华为 合唱队
- Android多线程编程、异步机制(AsyncTask)
- 每天一道算法题(36)——8皇后问题
- 理解Activity Fragment生命周期
- AngularJs 在ng-repeat中动态使用ng-model进行双向数据绑定(二)
- 面试练习题
- Android进程线程---Anynctask(本质还是Handler)
- [iOS]一些第三方框架的使用
- 终于解决困扰我多年的问题 浙江绍兴这边 洋拉毛树 树名原来叫 毛白杨 春天种子满天飞
- 数据结构中树的表示方法
- Asp.Net Application和Session内置对象讲解