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. Python全栈day24-25(面向对象编程)

    参考文档: http://www.cnblogs.com/linhaifeng/articles/6182264.html# 类:把一类事物的相同的特征和动作整合到一起就是类,类是抽象的概练 对象:就 ...

  2. Scalable IO in Java

    Scalable IO in Java http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf 大部分IO都是下面这个步骤, Most have same basi ...

  3. Kafka — 高吞吐量的分布式发布订阅消息系统【转】

    1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic.发送消息.消费消息?3.如何书写Kafka程序?4.数据传输的事务定义有哪三种?5.Kafka判断一个节点是否活着有哪两个条件 ...

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

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

  5. PyMongo和MongoEngine

    参见 http://stackoverflow.com/questions/5712857/pymongo-vs-mongoengine-for-django https://api.mongodb. ...

  6. for and range()

    pyhon 中 for 循环可以遍历任何序列的项目,如一个字典或者一个字符. for 循环格式一般如下: for <variable-变量> in <sequence-序列>: ...

  7. Python时间获取详解,Django获取时间详解,模板中获取时间详解(navie时间和aware时间)

    1.Python获取到的时间 import pytz from datetime import datetime now = datetime.now() # 这个时间为navie时间(自己不知道自己 ...

  8. sql server内存使用情况

    查看Sql Server 数据库的内存使用情况 转自:https://www.cnblogs.com/wanghao4023030/p/8299478.html    DBCC MemoryStatu ...

  9. 关于source insight、添加.s和.S文件,显示全部路径、加入项目后闪屏幕

    1.source insight使用也有一年多时间了,今天出现建工程后添加文件“no files found” 百思不得姐: 后面发现是原工程命名时出现非法字符.重新命名就ok了. 切记切记 2.实用 ...

  10. 同步锁,死锁现象与递归锁,信息量Semaphore.....(Day36)

    一.同步锁 三个需要注意的点: #1.线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock仍然没有被释放则阻塞,即便是拿到执行 ...