穷举vs暴搜vs深搜vs回溯vs剪枝(三)

news2025/1/15 7:57:40

文章目录

  • 字母大小写全排列
  • 优美的排列
  • N 皇后
  • 有效的数独

字母大小写全排列

题目:字母大小写全排列

在这里插入图片描述
思路

对每个位置的字符有两种情况

  • 不修改:数字字符,直接递归下一层;
  • 修改:字母字符,大写改小写、小写改大写后,递归下一层;

C++代码

class Solution 
{
    string path;
    vector<string> ret;
public:
    vector<string> letterCasePermutation(string s) 
    {
        dfs(s, 0);
        return ret;
    }
    void dfs(string& s, int pos)
    {
        if(pos == s.size())
        {
            ret.push_back(path);
            return;
        }

        int ch = s[pos];
        // 不改变
        path.push_back(ch);
        dfs(s, pos + 1);
        path.pop_back();

        // 改变
        if(ch < '0' || ch > '9')
        {
            char t = change(ch);
            path.push_back(t);
            dfs(s, pos + 1);
            path.pop_back();
        }
    }

    char change(char ch)
    {
        if(ch >= 'a' && ch <= 'z') ch -= 32;
        else ch += 32;
        return ch;
    }
};

优美的排列

题目:优美的排列

在这里插入图片描述
思路

我们可以使用回溯法解决本题,从左向右依次向目标排列中放入数即可

  • 使用 check数组来跟踪哪些数字已经被使用过。
  • 在每次递归中,检查当前排列是否符合优美排列的条件。
  • 基于回溯生成所有排列: 在排列中逐步填充数字,并检查每一步是否满足条件。
  • 统计符合条件的排列数量。

C++代码

class Solution 
{
    bool check[16];
    int ret;
public:
    int countArrangement(int n) 
    {
        // 从下表为 1 开始枚举
        dfs(1, n);
        return ret;
    }
    void dfs(int pos, int n)
    {
        if(pos == n + 1)
        {
            ret++;
            return;
        }
        for(int i = 1; i <= n; i++)
        {
            if(!check[i] && (pos % i == 0 || i % pos == 0))
            {
                check[i] = true;
                dfs(pos + 1, n);
                check[i] = false;
            }
        }
    }
};

N 皇后

题目:N 皇后

在这里插入图片描述
思路

在第一行放置第一个皇后,然后遍历棋盘的第二行,在合法的位置放置第二个皇后,再遍历第三行,以此类推,直到放置了n个皇后为止

  • 从第一行开始,尝试在每一列放置皇后
  • 对于每个放置位置,检查该位置的列和两个对角线是否已经被占用
  • 如果该位置未被占用,则放置皇后,并标记相应的列和对角线为已占用
  • 递归地尝试在下一行放置皇后
  • 如果在当前行无法放置皇后(即所有列和对角线都被占用),则回溯,撤销上一行的皇后放置,并尝试在当前行的下一个位置放置皇后
  • 当所有行都成功放置了皇后时,保存当前排列

C++代码

class Solution 
{
    bool checkCol[10], checkDig1[20], checkDig2[20];
    vector<vector<string>> ret;
    vector<string> path;
    int n;
public:
    vector<vector<string>> solveNQueens(int _n) 
    {
        n = _n;
        path.resize(n, string(n, '.'));
        dfs(0);
        return ret;
    }

    void dfs(int row)
    {
        if(row == n)
        {
            ret.push_back(path);
            return;
        }

        for(int col = 0;col < n; col++)
        {
            if(!checkCol[col] && !checkDig1[row-col+n] && !checkDig2[row+col])
            {
                path[row][col] = 'Q';
                checkCol[col] = checkDig1[row - col + n] = checkDig2[row + col] = true;
                dfs(row + 1);
                path[row][col] = '.';
                checkCol[col] = checkDig1[row - col + n] = checkDig2[row + col] = false;
            }
        }
    }
};

有效的数独

题目:有效的数独

在这里插入图片描述
思路

  • 遍历棋盘的每一个格子
  • 如果当前格子不是空字符.,则提取该字符代表的数字board[i][j] - '0'
  • 检查这个数字在当前行、当前列和当前3x3子网格中是否已经出现过(通过查看row[i][num]col[j][num]grid[i/3][j/3][num]是否为0
  • 如果这个数字在任何一处已经出现过,则返回false,表示数独无效
  • 如果这个数字在所有检查的地方都未出现过,则将其在rowcolgrid中标记为已出现过(即将相应的位置设为1
  • 如果遍历完所有格子都没有发现重复数字,则返回true,表示数独有效

C++代码

class Solution 
{
    int row[9][10];
    int col[9][10];
    int grid[3][3][10];
public:
    bool isValidSudoku(vector<vector<char>>& board) 
    {
        for(int i = 0; i < 9; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                if(board[i][j] != '.')
                {
                    int num = board[i][j] - '0';
                    if(!row[i][num] && !col[j][num] && !grid[i/3][j/3][num])
                    {
                        row[i][num] = col[j][num] = grid[i/3][j/3][num]=1;
                    }
                    else 
                        return false;
                }
            }
        }
        return true;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux_进程控制

一&#xff1a;进程创建 fork()函数创建新进程 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 进程调用fork&#xff0c;当控制转移到内核中的fork代码后&#xff0c;内核做&#xff1a;…

分享一些毕业论文答辩的ppt模板啦

优秀的论文需要有更精炼的载体呈现&#xff0c;如何提炼论文之中的精华并将其完整传递给听众&#xff08;你的导师或同学&#xff09;是每位毕业生的必学功课。PPT作为图文格式的集大成者&#xff0c;能够在一定程度上满足上面的需求&#xff0c;所以&#xff0c;学会利用ppt&a…

关乎于电子地图

文章目录 一、OGC与OpenGIS二、google map三、瓦片坐标系统四、可用地图图源汇总4.1Google Map4.2天地图4.3 必应地图4.4 高德公开地图4.5 星图地球4.6 ArcGIS可用的图源 一、OGC与OpenGIS OGC&#xff08;Open Geospatial Consortium&#xff09;——开放地理信息联盟&#x…

HCIE-Datacom题库_01_防火墙【18道题】

一、单选题 1.相比较于路由器、交接机&#xff0c;防火墙转发独有的模块为? 交换网板 MPU LPU SPU 解析&#xff1a; SFU&#xff08;Switch Fabric Unit&#xff09;&#xff1a;交换网板&#xff0c;负责整个系统的数据平面数据平面提供高速无阻塞数据通道&#xff0…

Linux系统:配置Apache支持CGI(Ubuntu)

配置Apache支持CGI 根据以下步骤配置&#xff0c;实现Apache支持CGI 安装Apache&#xff1a; 可参照文章&#xff1a; Ubuntu安装Apache教程。执行以下命令&#xff0c;修改Apache2配置文件000-default.conf&#xff1a; sudo vim /etc/apache2/sites-enabled/000-default.con…

【深度学习量化交易2】财务自由第一步,三个多月的尝试,找到了最合适我的量化交易路径

在上一篇文章中&#xff0c;我讲到了尝试开展量化交易的一些初步的想法&#xff1a;Mr.看海&#xff1a;【深度学习量化交易1】一个金融小白尝试量化交易的设想、畅享和遐想 一晃三个多月时间过去了&#xff0c;十一前后股市突然爆火&#xff0c;行情也像过山车一样&#xff0…

面对服务器掉包的时刻困扰,如何更好的解决

在数字化时代&#xff0c;服务器的稳定运行是企业业务连续性的基石。然而&#xff0c;服务器“掉包”现象&#xff0c;即数据包在传输过程中丢失或未能正确到达目的地的情况&#xff0c;却时常成为IT运维人员头疼的问题。它不仅影响用户体验&#xff0c;还可能导致数据不一致、…

spring boot热部署

使用热部署解决了每次都需要重新启动的问题&#xff0c;但不过热部署的在对于改动比较小时速度可能快一些&#xff0c;改动大的话尽量停止 1.使用热部署之前需要在pom.xml文件中导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifa…

基于SpringBoot+vue学生成绩管理系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的学生成绩管理系统&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL…

网关Gateway作用介绍和快速入门

目前架构问题分析 这里有很多微服务&#xff0c;每个微服务都需要晚上访问数据库去完成各自的业务&#xff0c;并且需要在nacos进行注册和管理&#xff0c;每一个微服务之间需要相互调用的时候&#xff0c;可以用Feign进行调用&#xff0c;当外部需要访问的时候&#xff0c;就直…

Linux操作系统——外存的管理(实验报告)

实验 Linux系统外存管理 一、实验目的 熟练Linux系统外存管理的方法与命令。 二、实验环境 硬件&#xff1a;PC电脑一台&#xff0c;网络正常。 配置&#xff1a;win10系统&#xff0c;内存大于8G 硬盘500G及以上。 软件&#xff1a;VMware、Ubuntu16.04。 三、实验内容 …

Type-c取点诱骗方案

如今随着这几年的USB-C PD适配器的普及&#xff0c;消费者手上的PD协议适配器越来越普遍&#xff0c;如何让微软surface 充电器线支持使用PD适配器快充&#xff1f;加入一颗受电端PD协议取电芯片——LDR6328能够完美的兼容市面上的PD适配器&#xff0c;支持不同的电压输出。 1…

javaweb以html方式集成富文本编辑器TinyMce

前言&#xff1a; 单一的批量图片上传按钮&#xff0c;禁用tinymce编辑器&#xff0c;但是还可以操作图片编辑&#xff1b; 多元化格式的富文本编辑要求&#xff1b; 采用tinymce实现。 附&#xff1a; tinymce中文手册网站&#xff1a; http://tinymce.ax-z.cn/download-all.…

Jmeter监控服务器性能

目录 ServerAgent 安装 打开Jmeter ServerAgent 在Jmeter上监控服务器的性能比如CPU&#xff0c;内存等我们需要用到ServerAgent&#xff0c;这里可以下载我分享 ServerAgent-2.2.3.zip 链接: https://pan.baidu.com/s/1oZKsJGnrZx3iyt15DP1IYA?pwdedhs 提取码: edhs 安装…

考研C语言程序设计_编程题相关(持续更新)

目录 零、说明一、程序设计经典编程题(C语言实现)T1 求1~100的奇数T2 求n!T3 求1!2!3!...10!T4 在一个有序数组中查找具体的某个数字n(二分查找)T5 编写代码&#xff0c;演示多个字符从两端移动&#xff0c;向中间汇聚T6 模拟用户登录(三次机会)T7 输入三个数 并从大到小输出T8…

实战篇:(四)Vue2 + Three.js 创建可交互的360度全景视图,可控制旋转、缩放完整代码

Vue2 Three.js 创建可交互的360度全景视图&#xff0c;可控制旋转、缩放 引言 在现代网页开发中&#xff0c;三维图形技术已经成为提升用户体验的重要工具。本文将展示如何使用 Three.js 创建一个简单的可交互360度全景视图。通过这一项目&#xff0c;你将能够学习到基本的场…

使用 KVM 在 Xubuntu 上创建 Windows 10 虚拟机

目录 前言说明注意准备 iso官网思博主(嘻嘻)拖动到虚拟机里面启动 virt-manager创建虚拟机选择本地安装介质选择 iso配置 内存 和 CPU选择 创建的虚拟机 保存的位置启动虚拟机看到熟悉的 Win10界面点击现在安装点击我没有产品密钥选择 Win10 专业工作站版勾选接受许可条款选择自…

grafana 配置prometheus

安装prometheus 【linux】麒麟v10安装prometheus监控&#xff08;ARM架构&#xff09;-CSDN博客 登录grafana 访问地址&#xff1a;http://ip:port/login 可以进行 Grafana 相关设置&#xff08;默认账号密码均为 admin&#xff09;。 输入账户密码 添加 Prometheus 数据源…

文件上传漏洞-绕过js验证

1.漏洞原理&#xff1a; Web应用系统虽然对用户上传的文件进行了校验&#xff0c;但是校验是通过前端javascript代码完成的。由于恶意用户可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件&#xff0c;就会导致基于js的校验很容易被绕过。 2.判断页面是否存在前…

SpringBoot下的智能健康推荐引擎

3系统分析 3.1可行性分析 通过对本基于智能推荐的卫生健康系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于智能推荐的卫生健康系统采用SSM框架&#…