回溯算法之棋盘问题hard

12.18 51N皇后

题目:

思路:

(1)用回溯的思想寻找每一行皇后的位置

(2)皇后位置的约束,创建一个新函数。使得与之前行的皇后不在同一列或斜线

(3)45度斜线行列和相等;135度斜线行列差相等。

时间复杂度(n!)

class Solution {List<List<String>> res=new ArrayList<>();LinkedList<String> path=new LinkedList<>();int n;public List<List<String>> solveNQueens(int n) {this.n=n;traceback(0);return res;}public void traceback(int start){if(start==n){res.add(new LinkedList<>(path));return;}for(int i=0;i<n;i++){if(!isvalid(start,i)){continue;}//满足条件创建字符串加入pathStringBuilder sb=new StringBuilder();for(int j=0;j<n;j++){if(j==i){sb.append('Q');}else{sb.append('.');}}path.add(sb.toString());traceback(start+1);path.removeLast();}}public boolean isvalid(int row,int col){if(row==0)return true;for(int i=0;i<path.size();i++){String s=path.get(i);//同一列if(s.charAt(col)=='Q')return false;//同一斜线if(col+(row-i)>=0&&col+(row-i)<s.length() &&s.charAt(col+(row-i))=='Q')return false;if(col-(row-i)>=0&&col-(row-i)<s.length() &&s.charAt(col-(row-i))=='Q')return false;}return true;}
}// 方法2:使用boolean数组表示已经占用的直(斜)线
class Solution {List<List<String>> res = new ArrayList<>();boolean[] usedCol, usedDiag45, usedDiag135;    // boolean数组中的每个元素代表一条直(斜)线public List<List<String>> solveNQueens(int n) {usedCol = new boolean[n];                  // 列方向的直线条数为 nusedDiag45 = new boolean[2 * n - 1];       // 45°方向的斜线条数为 2 * n - 1usedDiag135 = new boolean[2 * n - 1];      // 135°方向的斜线条数为 2 * n - 1//用于收集结果, 元素的index表示棋盘的row,元素的value代表棋盘的columnint[] board = new int[n];backTracking(board, n, 0);return res;}private void backTracking(int[] board, int n, int row) {if (row == n) {//收集结果List<String> temp = new ArrayList<>();for (int i : board) {char[] str = new char[n];Arrays.fill(str, '.');str[i] = 'Q';temp.add(new String(str));}res.add(temp);return;}for (int col = 0; col < n; col++) {if (usedCol[col] | usedDiag45[row + col] | usedDiag135[row - col + n - 1]) {continue;}board[row] = col;// 标记该列出现过usedCol[col] = true;// 同一45°斜线上元素的row + col为定值, 且各不相同usedDiag45[row + col] = true;// 同一135°斜线上元素row - col为定值, 且各不相同// row - col 值有正有负, 加 n - 1 是为了对齐零点usedDiag135[row - col + n - 1] = true;// 递归backTracking(board, n, row + 1);usedCol[col] = false;usedDiag45[row + col] = false;usedDiag135[row - col + n - 1] = false;}}
}

12.18 37解数独

思路:

(1)如何回溯。卡哥说是二维递归,比之前做的所有回溯题都要多一维。要在每一行每一列选择1到9中的一个数,而例如n皇后只用在每一行选择一个位置。

【代码上好像是多了两维,是从一层for循环变成了三层。但实际上这种维度的变化相当于只是多了两个参数而已。而二维与一维的最大不同点就是不能用递归的一个参数来表示行列变化了,这样每次都要递归都要走一遍已经确定数字的格子,不过递归过的格子数有标记,也就还是从下一个格子开始了。】

(2)判断有效性。根据空格的行列和填入的数判断是否有效。

(3)难点:回溯函数中什么时候返回false,什么时候返回true。

class Solution {public void solveSudoku(char[][] board) {traceback(board);}public boolean traceback(char[][] board){for(int i=0;i<9;i++){for(int j=0;j<9;j++){if(board[i][j]!='.')continue;//!注意k是char,数字带引号for(char k='1';k<='9';k++){if(isvaild(board,k,i,j)){board[i][j]=k;if(traceback(board))return true;board[i][j]='.';}}return false;//说明当前方案下,ij空格填入任何数都无法满足方案}}return true;}public boolean isvaild(char[][] board,char k,int row,int col){//同行for(int j=0;j<9;j++){if(board[row][j]==k)return false;}//同列for(int i=0;i<9;i++){if(board[i][col]==k)return false;}//同九宫格int startRow=row/3*3;int startCol=col/3*3;for(int i=startRow;i<startRow+3;i++){for(int j=startCol;j<startCol+3;j++){if(board[i][j]==k)return false;}}return true;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285842.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统设计——系统安全

HTTPS 是如何工作的&#xff1f; 安全超文本传输​​协议&#xff08;HTTPS&#xff09;是超文本传输​​协议&#xff08;HTTP&#xff09;的扩展。HTTPS 使用传输层安全性&#xff08;TLS&#xff09;传输加密数据。如果数据在网上被劫持&#xff0c;劫持者得到的只是二进制…

CRM客户登记管理系统:企业数字化转型的必备工具

客户登记管理系统&#xff08;CRM&#xff09;是一种用于记录和管理客户信息的软件系统。它用于存储和跟踪客户的基本信息、联系方式、交易历史、服务请求等关键数据&#xff0c;以便企业能够更好地了解客户、提供个性化的服务&#xff0c;并进行有效的销售和营销活动。 CRM系统…

迅为RK3588开发板瑞芯微国产化工业ARM核心板AI人工智能

性能强 iTOP-3588开发板采用瑞芯微RK3588处理器&#xff0c;是全新一代AloT高端应用芯片&#xff0c;采用8nm LP制程&#xff0c;搭载八核64位CPU&#xff0c;四核Cortex-A76和四核Cortex-A55架构&#xff0c;主频高达2.4GHz&#xff0c;8GB内存&#xff0c;32GB EMMC。 四核心…

用于噪声和分段相位测量的鲁棒相位展开算法(全文翻译-2区Optics Express)

摘要&#xff1a;本文提出了一种在存在噪声和分段相位的情况下进行相位展开的鲁棒相位展开算法&#xff08;RPUA&#xff09;。RPUA方法提出了一种新的相位导数模型&#xff0c;结合纠错迭代来实现抗噪声效果。此外&#xff0c;它使用数值载波频率和条纹外推法在空间域中桥接相…

vp与vs联合开发-通过FrameGrabber连接相机

添加控件 1.CogRecordDisplay 控件 用于显示图像 初始化相机对象方法 //启动窗体时 调用初始化相机方法 //封装相机关闭方法 //窗体关闭时 调用相机关闭方法 拍照 设置采图事件 // 保存图像 设置曝光按钮事件 1.可变参数

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka 1&#xff09;环境准备2&#xff09;准备相关 jar 包3&#xff09;实现场景4&#xff09;准备工作4.1.Mysql4.2.Kafka 5&#xff09;Flink-Sql6&#xff09;验证 1&#xff09;环境…

前端视角看 Docker :在国内的基础配置教程(含国内镜像源)

引言 在国内使用Docker时&#xff0c;直接从Docker Hub拉取镜像可能会遇到网络速度慢的问题。配置国内的镜像加速器可以显著提升拉取速度。本教程将指导您完成安装Docker后的基础配置&#xff0c;特别是设置国内镜像加速器。 1. 安装Docker 确保您已在系统上安装Docker。根…

不做数据采集,不碰行业应用,专注数字孪生PaaS平台,飞渡科技三轮融资成功秘诀

12月15日&#xff0c;飞渡科技在北京举行2023年度投资人媒体见面会&#xff0c;全面分享其产品技术理念与融资之路。北京大兴经开区党委书记、管委会主任常学智、大兴经开区副总经理梁萌、北京和聚百川投资管理有限公司&#xff08;以下简称“和聚百川”&#xff09;投资总监严…

UE5 C++(七)— UObject、UGameInstance实例化

文章目录 UObject实例化创建一个MyObject类在Default Pawn Class 中实现MyObject中参数调用 UGameInstance实例化创建GameInstance UObject实例化 创建一个MyObject类 在Default Pawn Class 中实现 注意&#xff1a;要实现运行时调用可在这里提前配置&#xff0c;具体参考之前…

力扣14题-最长公共前缀[简单]

题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl" 示例 2&am…

spring之面向切面:AOP(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

一文详细介绍Ehcache

title: Ehcache 快速入门 categories: 编程 Java 中间件 缓存 tags: Java 中间件 缓存 Ehcache abbrlink: 2720adf1 date: 2022-02-17 22:34:30 permalink: /pages/c4647d/ Ehcache 快速入门 EhCache 是一个纯 Java 的进程内缓存框架&#xff0c;具有快速、精干等特点&#xff…