面试题 08.12. N皇后
题目
设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。
注意:本题相对原题做了扩展
示例:
输入:4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
分析
这道题用回溯法的思路很清晰,重点在于如何判断当前放置棋子的位置是否合理。按行依次落子,定义一个数组pre记录已经落子的位置。因为按行的顺序落子,所以同一行不会出现冲突,行不用检查。因此只用遍历pre数组,检查是否有行冲突和对角线冲突即可。若两个位置在同一对角线,它们行序号之差的绝对值=列序号之差的绝对值。
代码
class Solution {
private List<List<String>> res=new ArrayList<>();
private int[] pre;
boolean isValid(int row,int col){
for(int i=0;i<row;++i)
if(col==pre[i]||Math.abs(row-i)==Math.abs(col-pre[i])) return false;
return true;
}
//ans代表了当前节点的状态
public void backtrack(int cur,int n,List<String> ans){
if(cur==n){
//添加不同元素要用不同的引用!!!
//因此不能直接添加ans
res.add(new ArrayList<>(ans));
return;
}
for(int i=0;i<n;++i){
if(isValid(cur,i)){
pre[cur]=i;
String s=ans.get(cur);
s=s.substring(0,i)+"Q"+s.substring(i+1);
ans.set(cur,s);
backtrack(cur+1,n,ans);
//还原状态
s=s.substring(0,i)+"."+s.substring(i+1);
ans.set(cur,s);
}
}
}
public List<List<String>> solveNQueens(int n) {
//初始化棋盘,所有位置都是'.'
char[] c=new char[n];
Arrays.fill(c,'.');
List<String> list=Collections.nCopies(n,new String(c));
List<String> ans=new ArrayList<>(list);
//pre[i]表示第i行棋子所在的列序号
pre=new int[n];
backtrack(0,n,ans);
return res;
}
}
原题链接:https://leetcode-cn.com/problems/eight-queens-lcci
面试题 08.12. N皇后的更多相关文章
- 新手C#SQLServer在程序里实现语句的学习2018.08.12
从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...
- .NET面试题系列[12] - C# 3.0 LINQ的准备工作
"为了使LINQ能够正常工作,代码必须简化到它要求的程度." - Jon Skeet 为了提高园子中诸位兄弟的英语水平,我将重要的术语后面配备了对应的英文. .NET面试题系列目录 ...
- java面试题系列12
1.面向对象的特征有哪些方面 a.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象 ...
- 蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题
在学习2n皇后之前,我们应该认识一下n皇后问题: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于 ...
- 免费获得NOD32 半年、1年 激活码-14.08.12到期
地址: http://nod32.ruanmei.com/ 活动时间: 2014年8月6日 - 8月12日(全部送完将提前终止). 活动规则: 1.每台电脑限领1枚NOD32激活码: 2.领到的NOD ...
- Storm(2015.08.12笔记)
2015.08.12Storm 一.Storm简介 Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架. Storm能实现高频数据和大规模数据的实时处理. 官网资料显示s ...
- java面试题08
1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1;编译时错误.对于shor ...
- 剑指Offer面试题:12.在O(1)时间删除链表结点
一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class ...
- 2018.08.12 bzoj5301: [Cqoi2018]异或序列(前缀和+莫队)
传送门 简单的异或前缀和处理+莫队统计答案. 惊奇的发现无论开不开long long都能跑过... 代码: #include<bits/stdc++.h> #define N 100005 ...
随机推荐
- Python习题集(七)
每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 如果有一个列表a= ...
- redis存取数据String
一.连接不同数据库和存取String类型值 1.连接数据库 2.set和get多个 3.取值并赋值 取值返回的是赋值改变之前的值: 4.递增和递减 5.字符串尾部加值 6.商品编号自增应用
- 马哈鱼数据血缘分析器分析case-when语句
马哈鱼数据血缘分析器是一个分析数据血缘关系的平台,可以在线直接递交 SQL 语句进行分析,也可以选择连接指定数据库获取 metadata.从本地上传文件目录.或从指定 git 仓库获取脚本进行分析. ...
- docker学习笔记(二)--配置镜像加速器
前提:docker已经安装好 配置过程 进入至阿里云开发中心,https://dev.aliyun.com/,点击管理中心 管理中心中,点击左侧镜像加速器. 修改配置文件,使用加速器,根据我们目前Do ...
- 215 day01_Object类、常用API
day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 教学目标 -[ ] 能 ...
- 关于buildroot移植的思考
buildroot是一个成熟的SDK框架,基于它有了openwrt. 曾经有一个项目,需要将原有的OpenWrt SDK改造,并且将软件框架重新定义.尝试精简原来的OpenWrt,并且删除所有的软件包 ...
- 【PHP数据结构】顺序表(数组)的相关逻辑操作
在定义好了物理结构,也就是存储结构之后,我们就需要对这个存储结构进行一系列的逻辑操作.在这里,我们就从顺序表入手,因为这个结构非常简单,就是我们最常用的数组.那么针对数组,我们通常都会有哪些操作呢? ...
- PHP中环境变量的操作
在 PHP 中,我们可以通过 phpinfo() 查看到当前系统中的环境变量信息(Environment).在代码中,我们也可以通过两个函数,查看和修改相应的环境变量信息. getenv() 获取环境 ...
- php 的一些问题
------------------------------------------------------------------------------ * 绝对路径转化为相对路径 <?ph ...
- turtle color设置的几种方式
t.colormode() 查看色彩模式,缺省1.0,即RGB范围在0-1 模式切换:参数填1.0或255 t.colormode(1.0) t.colormode(255) 设置颜色,以设置penc ...