题目

设计一种算法,打印 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皇后的更多相关文章

  1. 新手C#SQLServer在程序里实现语句的学习2018.08.12

    从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...

  2. .NET面试题系列[12] - C# 3.0 LINQ的准备工作

    "为了使LINQ能够正常工作,代码必须简化到它要求的程度." - Jon Skeet 为了提高园子中诸位兄弟的英语水平,我将重要的术语后面配备了对应的英文. .NET面试题系列目录 ...

  3. java面试题系列12

    1.面向对象的特征有哪些方面 a.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象 ...

  4. 蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题

    在学习2n皇后之前,我们应该认识一下n皇后问题: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于 ...

  5. 免费获得NOD32 半年、1年 激活码-14.08.12到期

    地址: http://nod32.ruanmei.com/ 活动时间: 2014年8月6日 - 8月12日(全部送完将提前终止). 活动规则: 1.每台电脑限领1枚NOD32激活码: 2.领到的NOD ...

  6. Storm(2015.08.12笔记)

    2015.08.12Storm   一.Storm简介 Storm是Twitter开源的一个类似于Hadoop的实时数据处理框架.   Storm能实现高频数据和大规模数据的实时处理. 官网资料显示s ...

  7. java面试题08

    1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1;编译时错误.对于shor ...

  8. 剑指Offer面试题:12.在O(1)时间删除链表结点

    一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class ...

  9. 2018.08.12 bzoj5301: [Cqoi2018]异或序列(前缀和+莫队)

    传送门 简单的异或前缀和处理+莫队统计答案. 惊奇的发现无论开不开long long都能跑过... 代码: #include<bits/stdc++.h> #define N 100005 ...

随机推荐

  1. 关于antd Select 限制选择个数的解决方案

    应用场景描述: Select 被form 所包裹,且被getFieldDecorator修饰.所以值的改变应该通过form的setFieldsValue方法. Select模式肯定会是multiple ...

  2. 7-31 堆栈操作合法性 (20 分) PTA

    7-31 堆栈操作合法性 (20 分)   假设以S和X分别表示入栈和出栈操作.如果根据一个仅由S和X构成的序列,对一个空堆栈进行操作,相应操作均可行(如没有出现删除时栈空)且最后状态也是栈空,则称该 ...

  3. GridView控件使用

    增加显示列gridView.Columns.AddVisible("AgentName", "姓名");设置是否为只读gridView1.OptionsBeha ...

  4. wrap()包裹被选元素的内容

    <!doctype html><html><head><meta charset="utf-8"><title>修改代码 ...

  5. 开源自己编写的半人工标注平台PaddleOCRLabel(.NET Winform版本)

    大家好, 我是博客园的老用户了,许久不做.NET技术了,从2013年起,开始从事App技术,写过书,在Linux上搭建区块链,用GO写智能合约,使用nodejs搭建过微服务,用python写过爬虫,写 ...

  6. Apache网页优化

    目录: 一.Apache网页优化概述 二.网页压缩 三.网页缓存 四.隐藏版本信息 五.Apache防盗链 一.Apache网页优化概述 在企业中,部署Apache后只采用默认的配置参数,会引发网站很 ...

  7. json包中的Marshal&Unmarshal 文档译本

    Marshal func Marshal(v interface{})([]byte, error) Marshal returns the JSON encoding of v. Marshal返回 ...

  8. RocketMQ详解(一)原理概览

    专题目录 RocketMQ详解(一)原理概览 RocketMQ详解(二)安装使用详解 RocketMQ详解(三)启动运行原理 RocketMQ详解(四)核心设计原理 RocketMQ详解(五)总结提高 ...

  9. Markdown公式用法大全

    目录 基本语法 两种代码引用方式 插入链接并描述 插入图片 有序列表 无序列表 分割线 表格 如何插入公式 如何输入上下标 如何输入括号和分隔符 如何输入分数 如何输入开方 如何输入省略号 如何输入矢 ...

  10. phpstoem破解

    https://blog.csdn.net/voke_/article/details/78794567