当前位置: 首页 > news >正文

51 N QUEENS

不知道简书搞什么。。刚才编辑了一下这个文章(原本是3.4写的),结果更新之后URL失效了,怎么也找不到了。。还好之前备份过RAR。简书这一点让人有点不太让人放心了,看来要经常备份才行。


这题是dfs套路,按照常理想的话我们需要一个存储坐标的数据结构,但这题只要一个一维数组就够了,因为n皇后的横坐标正好是0~n-1,而且每个slot只会有一个皇后。那表,(row,col(row))就代表Queen的坐标。 对于4皇后,前两次递归的样子是这样的: 首先,找到了row == 2的时候,发现每一个slot都不符合条件,咋办呢,不能继续DFS下去了, 结果集是(0,0) (1,2) (2,3) ____
col [] = {0,2,3,0} 第四个0是初始化的 这时候按理说应该结束上次DFS,然后去掉上次加进来的那个数字, 1000 0010 0001 0000

如果是这样的二维数组,就要把(2,3)的那个皇后拿走,置0,这样才能在第3行重新放一个皇后,但一维数组只有一个坑啊,回到row-1,再下来的时候,col[2]自然会被覆盖。所以不用remove操作。(我这里的理解可能有误。不需要remove的原因也许仅仅是因为 stack回到了上一个状态,那个状态下的数组col[row]还没有被插入)

下面的代码看似很长,其实dfs核心的部分很短,很大一部分是用来打印结果的。 我们知道DFS的套路,我自己总结一下大概是这样的:

  1. 终止条件
  2. 构造结果
  3. backtracking
  4. 恢复现场。

类似套路的题目有: LetterCombinationsOfAPhoneNumber、CombinationSum、Unique Binary Search Trees II 等等。

这题的终止条件里面顺便做了打印操作所以显得很长。这题不需要恢复现场现场(remove操作)。

    public List<List<String>> solveNQueens(int n) {

        List<List<String>> res = new ArrayList<>();
        if (n <= 0)
            return res;

        dfs(res, 0, n, new int[n]);
        return res;
    }

    //columnVal横坐标表示Q所在行,纵坐标表示Q所在列
    public void dfs(List<List<String>> result, int row, int n, int[] col) {
        if (row == n) {
            //col = [1,4,0,3];
            List<String> cell = new ArrayList<>();
            for (int i = 0; i < row; i++) {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < row; j++) {
                    if (col[i] == j) {
                        sb.append("Q");
                    } else {
                        sb.append(".");
                    }
                }
                cell.add(sb.toString());
            }
            result.add(new ArrayList<String>(cell));
            return;
        }
        for (int i = 0; i < n; i++) {
            col[row] = i;
            if (checkValid(row, col)) {
                dfs(result, row + 1, n, col);
            }
        }

    }

    public boolean checkValid(int row, int[] col) {
        for (int i = 0; i < row; i++) {
            if (col[i] == col[row] || Math.abs(i - row) == Math.abs(col[i] - col[row]))//同一列 || 斜线
            {
                return false;
            }
        }
        return true;
    }
复制代码

转载于:https://juejin.im/post/5a3133005188253d68179595

相关文章:

  • 浏览器部分UA汇总
  • Java基础/Socket.io双向通信
  • java web项目流程小结
  • linux下查看文件编码及修改编码
  • nginx https配置
  • 挨踢部落故事汇(7): 结缘51CTO志在高远
  • canvas做的桌面
  • 多个极路由配置桥接模式共同ssid上网
  • jmeter接口系列:时间戳、加密
  • Python练习3
  • Silverlight 解谜游戏 之二 创建题板
  • Linux下Elasticsearch-5.1.2简单集群搭建
  • 文件系统fdisk、gdisk、parted
  • JDK源码分析-Integer
  • 全栈必备 Java 基础
  • @angular/forms 源码解析之双向绑定
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 2017年终总结、随想
  • JavaScript DOM 10 - 滚动
  • JS基础之数据类型、对象、原型、原型链、继承
  • Laravel 中的一个后期静态绑定
  • Linux gpio口使用方法
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • npx命令介绍
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python 基础起步 (十) 什么叫函数?
  • Python爬虫--- 1.3 BS4库的解析器
  • Vue 2.3、2.4 知识点小结
  • Vue实战(四)登录/注册页的实现
  • 从零开始学习部署
  • 搭建gitbook 和 访问权限认证
  • 前端js -- this指向总结。
  • 前端面试之CSS3新特性
  • 微信开源mars源码分析1—上层samples分析
  • 为什么要用IPython/Jupyter?
  • 译有关态射的一切
  • 再谈express与koa的对比
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (02)vite环境变量配置
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (C#)获取字符编码的类
  • (C语言)球球大作战
  • (LeetCode) T14. Longest Common Prefix
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Google的Objective-C编码规范
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)memcache、redis缓存
  • (转)Mysql的优化设置
  • (转)ORM
  • (转载)hibernate缓存