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皇后问题,递归回溯的更多相关文章

  1. N皇后问题--递归回溯

    著名的N皇后问题,就是先按照行一行一行的找,先找第一行,第一行找到一列能满足条件,继续找下一行,如果下一行也找到一列能满足条件,继续找下一行,一次类推,最终找到解, 但是,如果找不到的话, 就说明上一 ...

  2. YTU 3013: 皇后问题(递归)

    3013: 皇后问题(递归) 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行 ...

  3. LeetCode || 递归 / 回溯

    呜呜呜 递归好不想写qwq 求“所有情况”这种就递归 17. Letter Combinations of a Phone Number 题意:在九宫格上按数字,输出所有可能的字母组合 Input: ...

  4. 递归回溯 UVa140 Bandwidth宽带

    本题题意:寻找一个排列,在此排序中,带宽的长度最小(带宽是指:任意一点v与其距离最远的且与v有边相连的顶点与v的距离的最大值),若有多个,按照字典序输出最小的哪一个. 解题思路: 方法一:由于题目说结 ...

  5. 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 ...

  6. 40. 组合总和 II + 递归 + 回溯 + 记录路径

    40. 组合总和 II LeetCode_40 题目描述 题解分析 此题和 39. 组合总和 + 递归 + 回溯 + 存储路径很像,只不过题目修改了一下. 题解的关键是首先将候选数组进行排序,然后记录 ...

  7. C#数据结构与算法系列(十四):递归——八皇后问题(回溯算法)

    1.介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的经典案例,该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即 任意两个皇后都不能处 ...

  8. 7, java数据结构和算法: 八皇后问题分析和实现 , 递归回溯

    什么是八皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法? 游戏连接: http://www.4399.com/ ...

  9. 【C/C++】n皇后问题/全排列/递归/回溯/算法笔记4.3

    按常规,先说一下我自己的理解. 递归中的return常用来作为递归终止的条件,但是对于返回数值的情况,要搞明白它是怎么返回的.递归的方式就是自己调用自己,而在有返回值的函数中,上一层的函数还没执行完就 ...

随机推荐

  1. mfc中 控件 对话框 添加颜色 背景图片

    1 设置对话框透明 在设置控件颜色中要使用 nCtlColor Contains one of the following values, specifying the type of control ...

  2. Java 语言基础之数组(一)

    数组定义及格式: 数组: 同一种类型数据的集合, 就是一个容器 定义数组格式1: 元素类型[] 数组名 = new 元素类型[元素个数(即数组长度)]; 说明: 数组是一个容器.而容器属于一个实体,实 ...

  3. 洛谷 P2331 [SCOI2005]最大子矩阵

    洛谷 这一题,乍一眼看上去只想到了最暴力的暴力--大概\(n^4\)吧. 仔细看看数据范围,发现\(1 \leq m \leq 2\),这就好办了,分两类讨论. 我先打了\(m=1\)的情况,拿了30 ...

  4. 我的Android进阶之旅------>android如何将List请求参数列表转换为json格式

    本文同步发表在简书,链接:http://www.jianshu.com/p/395a4c8b05b9 前言 由于接收原来的老项目并进行维护,之前的http请求是使用Apache Jakarta Com ...

  5. 让你的代码量减少3倍!使用kotlin开发Android

    (一) 创建Kotlin工程 (二) –秘笈!扩展函数 (三) 缩短五倍的Java Bean 本项目使用的代码地址

  6. python 多进程使用Queue通信的例子

    import time from multiprocessing import Process,Queue MSG_QUEUE = Queue(5) def startA(msgQueue): whi ...

  7. Delphi 正则表达式语法(5): 边界

    Delphi 正则表达式语法(5): 边界 // \b 单词边界 var   reg: TPerlRegEx; begin   reg := TPerlRegEx.Create(nil);   reg ...

  8. Java集合(3):Vector && Stack

    一.Vector介绍 Vector可以实现可增长的动态对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删 ...

  9. Spring.Net+NHibernate+Castle学习网站

    1.刘冬  http://www.cnblogs.com/GoodHelper/archive/2009/10/16/1584243.html 2.学习资料 http://www.cnblogs.co ...

  10. PAT 天梯赛 L1-005. 考试座位号 【MAP标记】

    题目链接 https://www.patest.cn/contests/gplt/L1-005 题意 有一个 考生号,一个试机座位,一个考试座位,给出试机座位,查询 考生号和考试座位 思路 MAP + ...