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. SetForegroundWindow以及 如何将一个某个窗口提到最顶层(转)

    http://hi.baidu.com/gookings/item/2b7912ca8d5b3625a0b50aa2 SetForegroundWindow 函数功能:该函数将创建指定窗口的线程设置到 ...

  2. Sublime text找不到.so文件

    在使用Sublime text打开一个android项目的时候,你会发现找不到.so文件. 解决方法: 点击Sublime text的Preferences,然后点击Settings,这时候出现设置的 ...

  3. DjangoDRF序列化组件使用

    创建一个Django项目,名字:untitled1 创建三张表 from django.db import models class Publish(models.Model): nid = mode ...

  4. phalcon—— PHP基础知识(一)

    一.变量和常量 1.1.变量名(标示符) 1)变量:$开头标志 2)变量名:能够由字母.数字,_ 3者组成,不能用数字开头 3)标识符是区分大写和小写的.但函数名不区分大写和小写. 4)变量名称能够与 ...

  5. I2C通信

    项目之前研究了I2C通信协议的实现,完成FPGA对视频解码芯片SAA7111A的初始化配置,设计实现了I2C主机对从机(SAA7111A)32个寄存器的写操作,因此只简单实现了I2C的写时序. 这次重 ...

  6. Python一些常用模块

    阅读目录 一: collections模块 二: time,datetime模块 三: random模块 四: os模块 五: sys模块 六: json,pickle 七: re正则模块 八:re模 ...

  7. go——并发(二)

    通常程序会被编写为一个顺序执行并完成一个独立任务的代码. 如果没有特别的需求,最好总是这样写代码,因为这种类型的程序通常很容易写,也容易维护. 不过也有一些情况下,并行执行多个任务会有更大的好处. 一 ...

  8. Windows Live Writer 网易博客配置

    一.去官网下载 Windows Live Write 组件 二.配置,选中其它服务,然后会到如下界面 主要是这里经常不知道选择什么,容易忘记. 下拉框选中metaweblog API 类型,把这个地址 ...

  9. Oracle_trunc截取函数

    转:http://blog.sina.com.cn/s/blog_6b58d2fa0100r6ub.html TRUNC函数用于对值进行截断. 用法有两种:TRUNC(NUMBER)表示截断数字,TR ...

  10. 8月自动化测试课程 - Selenium开源自动化测试实践

    8月自动化测试课程 - Selenium开源自动化测试实践 http://gdtesting.cn/news.php?id=35