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常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的.递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就 ...
随机推荐
- iOS UITextView 输入内容实时更新cell的高度
iOS UITextView 输入内容实时更新cell的高度 2014-12-26 11:37 编辑: suiling 分类:iOS开发 来源:Vito Zhang'blog 11 4741 UIT ...
- Java版接口自动化--初稿
一.接口参数的获取: 1.参数通过Excel读取,并将结果写入Excel中 package org.fanqi.operateExcel; import java.io.FileInputStream ...
- JS不改HTML任何代码就达到动态效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...
- 阻塞IO 非阻塞IO 异步IO
阻塞IO 一般表现为 进程/线程 调用IO操作后就一直死循环等待,直至IO操作结束,返回IO结果 非阻塞IO 一般表现为 进程/线程 调用IO操作后,可以先去干别的事情,但是每隔一段时间,回去询问一下 ...
- 洛谷 P2233 [HNOI]公交车线路
洛谷 不知道大家做没做过传球游戏,这一题和传球游戏的转移方程几乎一样. 令\(A\)为\(1\)点,\(E\)为\(5\)点,那么\(f[i][j]\)代表第i步走到j的方案数. \[f[i][j]= ...
- Selenium 安装与卸载
安装: 在cmd中键入pip install selenium==3.6.0(等号后面的为版本号),并点击回车,当出现Successfully installed selenium-3.6.0即表示已 ...
- Leetcode 之 Keys Keyboard
1. 2 Keys Keyboard 先把dp的最小不走都设置为无穷大(Integer.MAX_VALUE),初始化条件:dp[0] = dp[1] = 0,状态转移方程为dp[i] = Math.m ...
- 部署 jdk
首先安装jdk jdk提供java环境变量 jvm虚拟机 为什么同一份java程序可以在不同系统上跑? 就是因为jdk jvm虚拟机使java支持 跨平台服务器部署 首先jvm 去读取java代码 ...
- linux一路填坑...
1.安装ubuntu 从ubuntu9.0开始,一路更新,越来越垃圾,更可恶的是工作上经常指定特定的版本,于是乎,我电脑里装了n个版本的ubuntu. Win7 + Ubuntu 15.10 1)装完 ...
- xpath中遇到[<Element a at 0x39a9a80>](转)
Element是什么 回归正题,大家晕头转脑的看完繁杂的语法之后,已经迫不及待写点什么东西了,然后部分同学可能遇到了这个 <Element a at 0x39a9a80>或者类似 Elem ...