NQueens, NQueens2 N皇后问题,递归回溯
N皇后的规则:任意两个皇后不在同一行,不在同一列,不在同一斜线上。
算法分析:这种问题就用回溯法。深度搜索然后回溯。用一个数组记录每一行皇后的位置,下标代表行,值代表列。对行深度搜索。
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[n];
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[n];
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;
}
}
NQueens, NQueens2 N皇后问题,递归回溯的更多相关文章
- N皇后问题--递归回溯
著名的N皇后问题,就是先按照行一行一行的找,先找第一行,第一行找到一列能满足条件,继续找下一行,如果下一行也找到一列能满足条件,继续找下一行,一次类推,最终找到解, 但是,如果找不到的话, 就说明上一 ...
- YTU 3013: 皇后问题(递归)
3013: 皇后问题(递归) 时间限制: 1 Sec 内存限制: 128 MB 提交: 2 解决: 2 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行 ...
- LeetCode || 递归 / 回溯
呜呜呜 递归好不想写qwq 求“所有情况”这种就递归 17. Letter Combinations of a Phone Number 题意:在九宫格上按数字,输出所有可能的字母组合 Input: ...
- 递归回溯 UVa140 Bandwidth宽带
本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...
- FZU - 2038 -E - Another Postman Problem (思维+递归+回溯)
Chinese Postman Problem is a very famous hard problem in graph theory. The problem is to find a shor ...
- 40. 组合总和 II + 递归 + 回溯 + 记录路径
40. 组合总和 II LeetCode_40 题目描述 题解分析 此题和 39. 组合总和 + 递归 + 回溯 + 存储路径很像,只不过题目修改了一下. 题解的关键是首先将候选数组进行排序,然后记录 ...
- C#数据结构与算法系列(十四):递归——八皇后问题(回溯算法)
1.介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的经典案例,该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即 任意两个皇后都不能处 ...
- 7, java数据结构和算法: 八皇后问题分析和实现 , 递归回溯
什么是八皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法? 游戏连接: http://www.4399.com/ ...
- 【C/C++】n皇后问题/全排列/递归/回溯/算法笔记4.3
按常规,先说一下我自己的理解. 递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的.递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就 ...
随机推荐
- CoordinatorLayout Behaviors使用说明[翻译]
翻译与:Intercepting everything with CoordinatorLayout Behaviors 使用过Android Design Support Library的小伙伴应该 ...
- 【转】SpringMVC 拦截器
类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常用场景: 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 2.权限 ...
- slenium截屏
创建全屏截屏: public static byte[] takeScreenshot(WebDriver driver) throws IOException { WebDriver augment ...
- Exchange Version and UpdateRollups
Exchange Server 2010 Product name Build number Date KB Microsoft Exchange Server 2010 RTM 14.0.639.2 ...
- Docker Libnetwork Bridge插件实现代码分析----初始化部分
Bridge driver数据结构如下所示: type driver struct { config *configuration network *bridgeNetwork natChain *i ...
- session补充
- Java Synchronized 与 ThreadLocal 异同
同:都是为了线程安全 异:synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问.而ThreadLocal为每一个线程都提供了变量的副本, 使得每个线程在某一时间访问到的并 ...
- 两款高性能并行计算引擎Storm和Spark比較
对Spark.Storm以及Spark Streaming引擎的简明扼要.深入浅出的比較,原文发表于踏得网. Spark基于这种理念.当数据庞大时,把计算过程传递给数据要比把数据传递给计算过程要更富效 ...
- python16_day14【jQuery】
一.作用域 1.作用域例一 <script> var str = "global"; //AO1 AO1.str function t(age){ console.lo ...
- 转:asp.net获取url各项参数
假设当前页完整地址是:http://www.test.com/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www.te ...