NQueens, NQueens2 N皇后问题,递归回溯
2016-08-11 14:34
507 查看
N皇后的规则:任意两个皇后不在同一行,不在同一列,不在同一斜线上。
算法分析:这种问题就用回溯法。深度搜索然后回溯。用一个数组记录每一行皇后的位置,下标代表行,值代表列。对行深度搜索。
NQueens2:计算有多少种解决方案。
算法分析:用一个成员变量来记录解决方案的个数。
算法分析:这种问题就用回溯法。深度搜索然后回溯。用一个数组记录每一行皇后的位置,下标代表行,值代表列。对行深度搜索。
public class NQueens { public List<List<String>> solveNQueens(int n) { List<List<String>> res = new ArrayList<>(); if(n <= 0) { return res; } int[] columnVal = new int ; DFS_helper(n, res, 0, columnVal); return res; } public void DFS_helper(int queensNum, List<List<String>> res, int row, int[] columnVal) { if(row == queensNum)//已经遍历所有行了,得到结果 { List<String> list = new ArrayList<>(); for(int i = 0; i < queensNum; i ++) { StringBuffer sb = new StringBuffer(); for(int j = 0; j < queensNum; j ++) { if(j == columnVal[i]) { sb.append("Q"); } else { sb.append("."); } } list.add(sb.toString()); } res.add(list); } else { for(int i = 0; i < queensNum; i ++) { columnVal[row] = i; if(isValid(row, columnVal))//合法,就寻找下一行的位置,否则,变换当前行的值 { DFS_helper(queensNum, res, row+1, columnVal); } } } } public boolean isValid(int row, int[] columnVal) { for(int i = 0; i < row; i ++) { if(columnVal[i] == columnVal[row] || Math.abs(columnVal[row] - columnVal[i])== row - i) { return false; } } return true; } public static void main(String[] args) { NQueens q = new NQueens(); List<List<String>> list = q.solveNQueens(8); Iterator<List<String>> it = list.iterator(); int count = 0; while(it.hasNext()) { System.out.println(it.next()); count ++; } System.out.println(count); } }
NQueens2:计算有多少种解决方案。
算法分析:用一个成员变量来记录解决方案的个数。
public class Nqueens2 { public int count; public int totalNQueens(int n) { count = 0; if(n <= 0) { return count; } int[] columnVal = new int ; DFS_helper(n, 0, columnVal); return count; } public void DFS_helper(int queensNum, int row, int[] columnVal) { if(row == queensNum)//已经遍历所有行了,得到结果 { count ++; } else { for(int i = 0; i < queensNum; i ++) { columnVal[row] = i; if(isValid(row, columnVal))//合法,就寻找下一行的位置,否则,变换当前行的值 { DFS_helper(queensNum, row+1, columnVal); } } } } public boolean isValid(int row, int[] columnVal) { for(int i = 0; i < row; i ++) { if(columnVal[i] == columnVal[row] || Math.abs(columnVal[row] - columnVal[i])== row - i) { return false; } } return true; } }
相关文章推荐
- HDOJ/HDU 2553 N皇后问题 回溯加递归
- N皇后问题--递归回溯
- poj 2533 N皇后问题 -- 递归回溯(打表)
- 回溯法求n皇后问题(递归、非递归及优化)
- n皇后问题--递归回溯
- N皇后问题递归回溯
- 递归回溯问题的四道经典题:N皇后,组合,全排列,二叉树路径和
- N皇后问题 --递归及回溯解决方案
- 蓝桥杯2n皇后问题(简单递归回溯)
- 九度OJ 1254:N皇后问题 (N皇后问题、递归、回溯)
- 杭电 2553 N皇后问题 递归回溯 打表 附解题思路
- N皇后问题的非递归回溯和递归回溯
- 树的递归回溯 n皇后问题
- N皇后问题的递归回溯实现
- N皇后问题 HDU 杭电2553【递归回溯】
- 【十一】递归与回溯--解决8皇后问题
- N皇后问题-回溯与递归-C++实现
- N皇后问题 递归回溯
- 递归与回溯 HDOJ 2553 N皇后问题 1016 Prime Ring Problem
- 【蓝桥杯-递归回溯】八皇后问题+N皇后问题