Java与算法之(6) - 八皇后问题
来源:互联网 发布:windows经典系统桌面 编辑:程序博客网 时间:2024/06/06 03:39
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
(文字和图片来自百度百科)
如果动手来摆放皇后,可以用这样一种思路:在最左侧一列放下一个皇后,然后在右边一列从上到下找到第一个与左边皇后不冲突的位置,摆放第二个皇后;再向yo一列,从上到下找到第一个与前两个皇后不冲突的位置摆放第三个皇后,依次类推,直到在最后一列摆下第八个皇后。
认真思考的话,可以发现这仍然是深度优先搜索的思路,即步步推进,下一步做的事情和当前是一样的。代码:
public class DfsEightQueens { int[] queens = new int[8]; //记录每一列皇后的摆放位置 int count = 0; //摆法总数 public void dfs(int column) { if(column == 8) { //8个皇后都已经摆放 count++; System.out.println("第" + count + "种方法:"); print(); return; } for(int i = 0; i < 8; i++) { queens[column] = i; //在该列的第i行上放置皇后 if(isValid(column)) //检查摆放在该位置是否与前column-1列的皇后有冲突 dfs(column + 1); //没有冲突则开始下一列8个位置的尝试 } } private boolean isValid(int column) { for(int i = 0; i < column; i++) { //第column列上的皇后与前面column-1个皇后比较 if(queens[i] == queens[column]) //两个皇后在同一行上 return false; if(Math.abs(queens[i] - queens[column]) == (column - i)) //两个皇后在同一对角线上 return false; } return true; } private void print() { for(int i = 0; i < 8; i++) { for(int j = 0; j < 8; j++) { if(queens[i] == j) System.out.print("* "); else System.out.print("_ "); } System.out.println(); } } public static void main(String[] args) { DfsEightQueens q = new DfsEightQueens(); q.dfs(0); System.out.println("共" + q.count + "种摆放方法"); }}输出:
共92种摆放方法
0 0
- Java与算法之(6) - 八皇后问题
- 算法之八皇后问题
- 【数据结构与算法】八皇后问题之递归
- C++搜索与回溯算法之八皇后问题
- 数据结构与算法Java版——八皇后问题
- 八皇后问题与回溯算法
- 八皇后问题与回溯算法
- 数据结构与算法2:八皇后问题
- 回溯算法之八皇后问题
- 递归算法之八皇后问题
- 经典算法之八皇后问题
- 回溯算法之八皇后问题
- 回溯算法之八皇后问题
- 回溯算法之八皇后问题
- 回朔算法之 八皇后 问题
- 回溯算法之八皇后问题
- 《数据结构和算法》之八皇后问题
- 经典算法之八皇后问题
- Struts2的配置文件和加载顺序
- 访问控制符
- yii2无符合条件的查询结果总结。
- Android - MPTCP - (./net/ipv4/Kconfig)
- ACM 几何基础(2)
- Java与算法之(6) - 八皇后问题
- 将ResultSet结果集通过反射转换成对象LIST集合
- xgboost 在window7环境下安装
- 熊猫烧香之手动查杀
- RxJava之条件和布尔操作符
- 引用与指针的区别
- 第二周项目--汉诺塔实验
- UIView动画与core animation之间的关系
- 转载:Cxf webservice Can't find the request for **'s Observer