回溯法解决八皇后问题(java实现)
来源:互联网 发布:csmar数据库 编辑:程序博客网 时间:2024/05/18 08:30
算法课上需要用回溯法解决八皇后问题,八皇后问题就是国际象棋棋盘(8*8)上摆放8个棋子,同一横行、竖行、斜线上不能摆放棋子,问有多少种摆法。
回溯法是五大常用算法之一。
回溯法的基本思想是:
1、在解空间树中,从根节点出发,采用深度优先搜索的思想来遍历解空间树。每一次遍历节点时都判断当前 节点是否为合法解,如果为合法解,那么继续遍历其自子树,如果不是合法节点,那么访问其下一个兄弟 节点,如果没有下一个兄就退回到父节点(回溯),访问父节点下一个兄弟节点。
2、回溯法结束的条件是回溯到根节点而且所有子树均已遍历到。
3、回溯法归根结底是一种带有节点判断条件的深度优先搜索算法。
八皇后问题求解:
用column[numQueeen]作为解的容器。
i代表列值,column[i]代表行值
1、同行判断:
column[i] != column[j]
2、同列判断:
i != j
3、斜线判断:
column[i] != column[j]
2、同列判断:
i != j
3、斜线判断:
col[i] + Math.abs(j - i) != col[j](正斜线)
col[i] - Math.abs(j - i) != col[j](反斜线)java代码
public class eightQueen { public static final int numQueeen = 8; //皇后个数;行列数 public static int[] column = new int[numQueeen]; //保存结果矩阵 public static int numResult = 0; public static boolean judgeLegality(int[] col , int depth) { for (int i = 0; i <= depth ; i++) for (int j = i + 1; j <= depth ; j++) { if (col[i] == col[j]) //在同一个列 return false; else if(col[i] + Math.abs(j - i) == col[j] || col[i] - Math.abs(j - i) == col[j]) //判断是否在同一在斜线上 return false; }; return true; } public static void main(String[] args) { int i = 1 ; while (true ) { if (i == numQueeen ) { //找到一个八皇后,输出 numResult++; for (int j = 0; j < numQueeen ; j++) System.out.println(column[j]+"-"+ j); System.out.println(); i--; //回溯 column[i] ++; } else { while( i < numQueeen && column[i] < numQueeen && eightQueen.judgeLegality(column,i) == false ) //满足约束条件并且在解空间内 column[i] = column[i]+1; //当前解的下一个解 if (i < numQueeen && column[i] < numQueeen){ i = i+1; //遍历到下一个节点 } else{ if (column[i] >= numQueeen) //如果是值超出 column[i] = 0; if ( i == 0) { System.out.println("找到解数量:" + numResult); break; } i = i-1; //回溯到上一个解 column[i]++; } } } }}
输出
7-03-10-22-35-41-56-64-7找到解数量:92
阅读全文
0 0
- 回溯法解决八皇后问题(java实现)
- 回溯法解决八皇后问题(java实现)
- 用回溯法解决八皇后问题(Java实现)
- 回溯法解决八皇后问题---用Java语言
- 回溯法解决N皇后问题(java实现)
- 回溯法解决“八皇后”问题
- 回溯法解决八皇后问题
- 回溯法解决八皇后问题
- 回溯法解决八皇后问题
- 回溯法解决八皇后问题
- scala 回溯法解决八皇后问题
- 回溯法解决八皇后问题
- 回溯法解决八皇后问题
- 回溯法解决八皇后问题(循环/递归)
- 回溯法实现八皇后问题
- 回溯法实现八皇后问题
- 回溯 八皇后问题(JAVA)
- 回溯实现八皇后问题
- Rcpp手册(旧)
- 2017 山东理工第九届校赛 H C~K玩游戏(博弈)
- 日拱一卒——160个crackme之#3
- java 基础(一)
- Linux学习(二):复制命令cp的注意事项
- 回溯法解决八皇后问题(java实现)
- 【记录】linux内核打补丁、编译
- 1.2.2合并线程(Joining Threads)
- DNS中的正向解析与反向解析
- 金融市场相关业务定义一
- Python之数据可视化神奇-Matplotlib
- 【LectCode】15. 3Sum
- 直接插入排序-java实现
- 怎么用弱引用实现内存泄漏检测