代码随想录算法训练营第三十天 | 332.重新安排行程,51. N皇后 ,37. 解数独

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这道题是一道欧拉路径/ 欧拉回路的一笔画问题,需要找出开销最小的一笔画方案

这种一笔画的问题,以前学数据结构的时候我们习惯把图放进二维数组中存储,但对于这种无规律的图结构,我们可以使用二维的哈希表来存储,这样可以方便的记录下每个节点的邻接节点和访问情况,相当于一次完成了二维数组中存储时的graph和visit二维数组 本处使用的存储结构为unordered_map<string,map<string,int>>

unordered_map的key是起点,作为value的map存储邻接节点和节点当前的可用计数
使用map主要是可以做一个自动的字典序节点排序(红黑树)

本题使用回溯法来解答,其实就是一个每层节点按照字典排序的DFS,有点小贪心的思路在里面

class Solution {
public:
    vector<string> res;
    unordered_map<string,map<string,int>> ticketMap;
    void resInit(vector<vector<string>>& tickets){
        ticketMap.clear();
        for(auto i : tickets){
           ticketMap[i[0]][i[1]]++;
        }

        res.push_back("JFK");
    }
    bool DFS(vector<vector<string>>& tickets,int ticketNum){
         if(ticketNum == tickets.size()){
            return true;
         }

         for(pair<const string,int> & des : ticketMap[res[res.size()-1]]){
                if(des.second > 0){
                    res.push_back(des.first);
                    des.second--;
                    if(DFS(tickets,ticketNum+1)) return true;
                    res.pop_back();
                    des.second++;
                }
         }
         return false;
    }
    vector<string> findItinerary(vector<vector<string>>& tickets) {
         resInit(tickets);
         DFS(tickets,0);
         return res;
    }
};

在这里插入图片描述
在这里插入图片描述
经典N皇后问题,看起来像是一个二维的递归问题,其实不是(或者说是一个在某一维度受限的二维递归),因为它每一层只需要考虑一个位置放皇后,然后就可以继续向下考虑了,所以说,他的选择列表不是二维的

class Solution {
public:
    vector<vector<string>> res;
    vector<vector<bool>> resMatrix;
    vector<string> resVec;
    void resInit(int & n){
        for(int i = 0;i< n;i++){
            vector<bool> resBool(n,false);
            resMatrix.push_back(resBool);
        }
    }
    bool isValid(vector<vector<bool>> resMatrix,int &n,int line,int row){
        for(int i = line;i>= 0;i--){
           if(resMatrix[i][row]){
              return false;
           }
           if(row + (line - i) < n && resMatrix[i][row + (line - i)]){
              return false;
           }
           if(row - (line - i) >=0 && resMatrix[i][row - (line - i)]){
              return false;
           }
        }
        return true;
    }
    void traceback( vector<string> resVec,int & n,int line,vector<vector<bool>> resMatrix){
         if(resVec.size() == n || line > n){
            res.push_back(resVec);
            return;
         }
         for(int i = 0;i< n;i++){
            if(!isValid(resMatrix,n,line,i)){
               continue;
            }
            string s = "";
            for(int j = 0;j < n;j++){
               if(j == i){
                  s.push_back('Q');
               }else{
                s.push_back('.');
               }              
            }
            resVec.push_back(s);
            resMatrix[line][i] = true;
            traceback(resVec,n,line+1,resMatrix);
            resMatrix[line][i] = false;
            resVec.pop_back();
         }
    }
    vector<vector<string>> solveNQueens(int n) {
             resInit(n);
             traceback(resVec,n,0,resMatrix);
             return res;
    }
};

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    void resInit();
    bool isValid(vector<vector<char>>& board,int &i,int &j,char &c){
         for(int row = 0;row< board[0].size();row++){
            if((board[i][row]) == c){
                return false;
            }
         }
          for(int line = 0;line< board.size();line++){
            if((board[line][j]) == c){
                return false;
            }
         }

         int startX = (i / 3) * 3;
         int startY = (j / 3) * 3;
         for(int xIdx = startX;xIdx< startX+3;xIdx++){
             for(int yIdx = startY;yIdx< startY+3;yIdx++){
                 if(board[xIdx][yIdx] == c){
                     return false;
                 }
             }
         }
         return true;
    }
    bool traceback(vector<vector<char>>& board){
        for(int i = 0;i< board.size();i++){
            for(int j = 0;j< board[0].size();j++){
               if(board[i][j] != '.'){
                  continue;
               }

               for(char c = '1';c<= '9';c++){
                  if(!isValid(board,i,j,c)){
                      continue;
                  }
                  board[i][j] = c;
                  if(traceback(board)){
                    return true;
                  }
                  board[i][j] = '.';
               }
               return false;
            }
        }
        return true;
    }
    void solveSudoku(vector<vector<char>>& board) {
        traceback(board);
    }
};

这道题算是一个二维递归的问题,但其实也就这样,它和N皇后或者其他一维递归问题的区别是一维递归可以通过连续逻辑空间下的自然递增/递减找到下一个需要进行递归处理的位置,这道题需要在一个嵌套循环下找下一个需要处理的位置

总体思路没变太多

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【4月】CDA Club 第2期数据分析组队打卡学习活动开启!

活动名称 CDA Club 第2期数据分析组队打卡学习活动 活动介绍 本次打卡活动由CDA俱乐部旗下学术部主办。目的是通过数据分析科普内容&#xff0c;为数据分析爱好者提供学习和交流的机会。方便大家利用碎片化时间在线学习&#xff0c;以组队打卡的形式提升学习效果&#xff0c…

水离子雾化壁炉的原理和技术解析

水离子雾化壁炉采用超声波雾化技术将水分子雾化成微细的水离子&#xff0c;然后通过风扇吹出再经过UVC紫外线杀菌产生安全仿真的火焰效果。以下是水离子雾化壁炉的原理和技术解析&#xff1a; 超声波雾化技术&#xff1a; 水离子雾化壁炉利用超声波振动器产生高频振动&#xf…

[Java、Android面试]_13_map、set和list的区别

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可关注收…

TSN协议原理!看完这一篇就够了(1)——时钟同步IEEE802.1AS-2020

▎前言 在许多应用场景中&#xff0c;一个本地局域网中互联的设备集群需要共享同一个时间&#xff0c;以支持各设备的协同工作。例如&#xff1a;音频设备与视频设备的配合播放&#xff0c;雷达与摄像头的数据融合等&#xff1b;这样一个看似简单的域功能&#xff0c;细化成为…

好书推荐 :《 提问的艺术:让 ChatGPT 给出高质量答案 》

AGI 时代降临&#xff01;还不知如何向 ChatGPT 提问&#xff1f; 恰当的提示至关重要&#xff01;《提问的艺术—让 ChatGPT 给出高质量答案》一书&#xff0c;共 24 章&#xff0c;系统介绍了如何向 ChatGPT 提问以获取优质答案&#xff0c;是 ChatGPT 时代的入门指南&#x…

【 Mysql8.0 忘记登录密码 可以试试 】

** Mysql8.0 忘记登录密码 可以试试 ** 2024-3-21 段子手168 1、首先停止 mysql 服务 &#xff0c;WIN R 打开运行&#xff0c;输入 services.msc 回车打开服务&#xff0c;找到 mysql 服务&#xff0c;停止。 然后 WIN R 打开运行&#xff0c;输入 CMD 打开控制台终端输…

‘npm‘ 不是内部或外部命令,也不是可运行的程序

npm认识三年了&#xff0c;今天才知道这是node.js的命令 也就是说&#xff0c;想要在cmd里面运行 npm 命令&#xff0c;但就的安装node.js 1. node.js安装 没有安装包的先下载安装包&#xff1a;下载 | Node.js 中文网 (nodejs.cn) 下载之后双击打开&#xff0c;一路安装确…

如何为企业策划一场XR虚拟直播?

活动年年办&#xff0c;都是老一套&#xff0c;想玩点新花样&#xff1f; 预算有限&#xff0c;但还是想把活动办的逼格高一点&#xff1f; 想通过活动&#xff0c;让更多的人知道自己企业的品牌&#xff1f; 随着AIGC技术的不断演变&#xff0c;企业活动的形式和内容也在不…

Node.js之沙盒专题

​ Node.js一直是薄弱项&#xff0c;今天特意整理一下&#xff0c;基本上是各个大佬写的大杂烩&#xff0c;仅用于学习记录~~~ 1. child_process 首先介绍一下nodejs中用来执行系统命令的模块child_process。Nodejs通过使用child_process模块来生成多个子进程来处理其他事物…

滤波器自动化测试:用网络分析仪、示波器、功率计测量功率

滤波器的功率是电压与电流的乘积&#xff0c;滤波器的功率可以通过测量电压与电流计算得出。滤波器的功率对滤波器的稳定运行是至关重要的&#xff0c;如果功率过小可能会导致滤波器无法正常工作;功率越大则有可能会造成滤波器的损坏。因此滤波器的功率测量是非常重要的步骤。 …

基于51单片机的客车汽车安全气囊控制器Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/10enj1EYm_0Z8f_19Sz_eCQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52简介&#xff1a; AT89C52是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectronics&#xff09;公…

第一周周考技能

文章目录 1月1. 任意输入一个3位整数&#xff08;100~999&#xff0c;包含100与999&#xff09;&#xff0c;判断输入的整数是否是质数&#xff0c;如果是质数则输出是质数&#xff0c;否则输出不是质数2.“降序数”是指一个自然数的低位数字不大于高位数字的数。例如&#xff…

工单系统大揭秘!选择工单系统需注意的关键因素!

如何选择工单系统&#xff1f;工单系统作为数字化工具&#xff0c;可以帮助企业高效处理工单业务问题&#xff0c;助力企业数字化转型。目前市面上的工单系统可谓是琳琅满目。 本文详细讲解了目前市面上工单系统的主要类型&#xff0c;以及企业该如何选择工单系统~ 一、工单系…

怎样批量在文件名后面加上相同的字符?

怎样批量在文件名后面加上相同的字符&#xff1f;在日常工作中&#xff0c;有时我们需要对大量文件进行批量处理&#xff0c;比如在文件名后面统一添加相同的字符。这项工作可以通过编写简单的脚本或程序来实现&#xff0c;从而提高工作效率。批量在文件名后面加上相同的字符是…

JS-13-高阶函数

一、高阶函数的定义 JavaScript的函数其实都指向某个变量&#xff0c;如&#xff1a; var abs function (x) {// 函数体 }; 既然变量可以指向函数&#xff0c;函数的参数能接收变量&#xff0c;那么一个函数就可以接收另一个函数作为参数&#xff0c;这种函数就称之为高阶函…

CCF-CSP认证考试 202212-2 训练计划 100分题解

更多 CSP 认证考试题目题解可以前往&#xff1a;CSP-CCF 认证考试真题题解 原题链接&#xff1a; 202212-2 训练计划 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题背景 西西艾弗岛荒野求生大赛还有 n n n 天开幕&#xff01; 问题描述 为了在大赛中取得…

shell实现查询进程号并批量kill(脚本)

问题或需求描述 在shell中&#xff0c;如果你想通过命令行查询出一系列匹配某个关键词的进程&#xff0c;并使用xargs命令批量结束这些进程&#xff0c;可以按照以下步骤操作&#xff1a; # 查询并提取进程号 pgrep -f "关键词" | xargs kill# 或者&#xff0c;如果…

Qt 用任意直线来分割多边形,返回分割后的多边形

任意直线分割多边形&#xff0c;返回分割后的多边形 效果 使用示例 QPolygonF LineSegmentationPolygon(const QPolygonF& poly, const QLineF& line, SideToRemove sideToRemove)源码 enum class SideToRemove {None,Left,Right};// 直线分割多边形 QPolygonF LineS…

多叉树题目:N 叉树的前序遍历

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;N 叉树的前序遍历 出处&#xff1a;589. N 叉树的前序遍历 难度 3 级 题目…

10-shell编程-辅助功能

一、字体颜色设置 第一种: \E[1:色号m需要变色的字符串\E[0m 第二种: \033[1:色号m需要变色的字符串\033[0m ########################### \E或者\033 #开启颜色功能 [1: #效果 31m #颜色色号 \E[0m #结束符 1&#xff0c;颜色案例 2&#xff0c;效果案例 二、gui&am…
最新文章