【回味“经典”】DFS基础训练(N皇后,装载问题)

这篇文章是一年前写的 走进“深度搜索基础训练“,踏入c++算法殿堂(一)和 走进“深度搜索基础训练“,踏入c++算法殿堂(二)的重编版。

希望以此,唤起对那位故人的回忆。

小航走入赛场,比赛即将开始……

主持人:欢迎来到深度搜索基础训练的比赛现场。首先,感谢全心全意为我们挖坑、绞尽脑汁出难题的出题老师们;然后,感谢古灵精怪的农夫John;最后,感谢c++……废话少说,比赛开始!

小航看向第一题……


【搜索与回溯算法】N皇后问题

小航看到(题面)

时间限制: 1000 ms 空间限制: 262144 KB 具体限制

题目描述:

在一个nXn的国际象棋棋盘上放置n(n<=12)个皇后,使它们不能互相攻击(即任意两个皇后不能在同一行、同一列或同一对角线上)。试求出所有方法。

输入:

输入一个数n .(n<=12)

输出:

输出所有的排列方案总数。

样例输入:

4

样例输出:

2

 小航想到(思路)

1.合法检查

即需要判断:

1)是否处于同一列中

2)是否在左斜线上:(行 + 列)的值不可相等(绝对值)

3)是否在右斜线上:(列 - 行)的值不可相等(绝对值)

4)为何不需要判断每一行?

因为在DFS中,x已经代表了行,根据算法,每一行也只有一个,所以无需判断。

3.DFS搜索

1)结束条件:当前行数 = 皇后总数,即最后一行已经成功放入皇后

2)循环一行中的每一个位置,若不发生攻击事件,可将皇后放入该位置

3)继续下一行的搜索,即传入的参数为当前行数 + 1

小航写道(代码)

#include<iostream>
using namespace std;
int a[105],b[105],c[105],n,s;//数组a为判断列是否放置皇后,b、c都是判断对角线是否放置皇后
void dg(int x)//循环行
{for(int i=1;i<=n;i++)//循环列{if(a[i]!=1&&b[x+i]!=1&&c[i-x+n-1]!=1){a[i]=1;b[i+x]=1;c[i-x+n-1]=1;//上面两步及这步都是标记if(x==n){s++;//当放到最后一个,方案数增加}else{dg(x+1);//进入下一行放置}	a[i]=0;b[i+x]=0;c[i-x+n-1]=0;//回溯} } 
}
int main()
{cin>>n;dg(1);cout<<s;//输出方案数
}

小航很快就把第一道题做完了,准备迎接下一题……


【搜索与回溯算法】装载问题 (Standard IO)

时间限制: 1000 ms 空间限制: 262144 KB 具体限制

题目描述:

有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi。找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船。

输入:

第一行有2个正整数n和c。n是集装箱数,c是轮船的载重量。接下来的1行中有n个正整数,表示集装箱的重量。

输出:

将计算出的最大装载重量输出

样例输入:

5 10
7 2 6 5 4

样例输出:

10

数据范围限制:

n<=35,c<=1000

“其实这就是一道超级简单的背包问题,可以用递归解决。”小航想,“建立一个临时重量和最终重量,搜索每一个数字(选与不选),只要搜索后的结果大于最终结果,就赋值。”

#include<iostream>
using namespace std;
int n,c,w[40],s;
void dfs(int x,int sx)//第x个物品,sx为临时重量
{if(x>n){if(sx>s) s=sx;//赋值return;}else{if(sx+w[x]<=c)//如果装入此物品,还没超载的话……{dfs(x+1,sx+w[x]);//装入此物品,并搜索下一件物品}dfs(x+1,sx);//在不装入此物品的情况下,搜索下一件物品}
}
int main()
{cin>>n>>c;for(int i=1;i<=n;i++) cin>>w[i];dfs(1,0);cout<<s;//输出最终重量
}

       但是。小航后来知道,这个看似简单的程序险些超时。他不甘心,修改了一下:

#include<bits/stdc++.h>
using namespace std;
int n,c,w[40],s,b[40],ms=0;
void dg(int x)
{if(s>=c){if(s==c){printf("%d",s);exit(0);}s-=w[x-1];if(ms<s)ms=s;s+=w[x-1];}else if(x==n){if(ms<s)ms=s;}else{s+=w[x];dg(x+1);s-=w[x];dg(x+1);}return;
}
int main()
{scanf("%d%d",&n,&c);for(int i=0;i<n;i++)scanf("%d",&w[i]);dg(0);printf("%d",ms);return 0;
} 

#include<bits/stdc++.h>
using namespace std;
int n,c,w[40],s,b[40],ms=0;
void dg(int x)
{
    if(s>=c)
    {
        if(s==c)
        {
            printf("%d",s);
            exit(0);
        }
        s-=w[x-1];
        if(ms<s)
            ms=s;
        s+=w[x-1];
    }
    else if(x==n)
    {
        if(ms<s)
            ms=s;
    }
    else
    {
        s+=w[x];
        dg(x+1);
        s-=w[x];
        dg(x+1);
    }
    return;
}
int main()
{
    scanf("%d%d",&n,&c);
    for(int i=0;i<n;i++)
        scanf("%d",&w[i]);
    dg(0);
    printf("%d",ms);
    return 0;
}  

        这样运行时间缩短了不少。


        之后,下一题又映入眼帘……

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

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

相关文章

常见的网络设备有哪些?分别有什么作用?

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络设备的概述 二、常见的网络设备 1、…

eslintignore无效解决办法

项目的根目录下新建.eslintignore&#xff0c;但是无论怎么配置&#xff0c;该文件总是无法生效。本想解决不生效的问题&#xff0c;但是一直无法解决&#xff0c;于是换了一种解决问题的思路。 方法一&#xff1a; 在需要进行忽略的文件顶部加上 /* eslint-disable */这样e…

JVS低代码中表单引擎与逻辑引擎是如何联合调用外部API的?

在企业项目中&#xff0c;常常出现需要给外部系统提供一个api &#xff0c;让外部系统触发调用&#xff0c;本系统直接数据入库&#xff0c;那么我们来看看jvs的表单引擎与逻辑引擎联合实现这个功能&#xff0c;先看实现效果&#xff1a; 配置步骤&#xff1a; 一、配置列表页…

【机密计算实践】支持 Intel SGX 的 LibOS 项目介绍(一)

一、LibOS 库操作系统(Library Operating System,简称 LibOS)是根据某类应用的特殊需求,由某一高级编程语言将原本属于操作系统内核的某些资源管理功能,如文件磁盘 I/O、网络通信等,按照模块化的要求,以库的形式提供给应用程序的特殊操作系统。 它能代替操作系统内核合…

springboot(JavaCV )实现视频截取第N帧并保存图片

springboot&#xff08;JavaCV &#xff09;实现视频截取第N帧并保存图片 现在视频网站展示列表都是用img标签展示的&#xff0c;动图用的是gif&#xff0c;但是我们上传视频时并没有视屏封面&#xff0c;就这需要上传到服务器时自动生成封面并保存 本博客使用jar包的方式实现…

如何成功开展跨境电子商务?快速入门!

随着全球化的推进和互联网技术的发展&#xff0c;跨境电子商务已经成为许多企业追求新市场和实现增长的重要途径。然而&#xff0c;要在这个竞争激烈的领域中脱颖而出并取得成功并非易事。本文将介绍三个可行的策略&#xff0c;以帮助企业成功开展跨境电子商务。 第一策略&…

浙大数据结构第八周之08-图8 How Long Does It Take

前置知识&#xff1a; 拓扑排序&#xff1a; /* 邻接表存储 - 拓扑排序算法 */bool TopSort( LGraph Graph, Vertex TopOrder[] ) { /* 对Graph进行拓扑排序, TopOrder[]顺序存储排序后的顶点下标 */int Indegree[MaxVertexNum], cnt;Vertex V;PtrToAdjVNode W;Queue Q Cre…

网络面试题(172.22.141.231/26,该IP位于哪个网段? 该网段拥有多少可用IP地址?广播地址是多少?)

此题面试中常被问到&#xff0c;一定要会172.22.141.231/26&#xff0c;该IP位于哪个网段&#xff1f; 该网段拥有多少可用IP地址&#xff1f;广播地址是多少&#xff1f; 解题思路&#xff1a; 网络地址&#xff1a;172.22.141.192 10101100.00010110.10001101.11000000 广播…

【后端速成 Vue】第一个 Vue 程序

1、为什么要学习 Vue&#xff1f; 为什么使用 Vue? 回想之前&#xff0c;前后端交互的时候&#xff0c;前端收到后端响应的数据&#xff0c;接着将数据渲染到页面上&#xff0c;之前使用的是 JavaScript 或者 基于 JavaScript 的 Jquery&#xff0c;但是这两个用起来还是不太…

uni-app 打包生成签名Sha1

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 可以使用JRE环境中的keytool命令生成。以下是windows平台生成证书的方法&#xff1a; 安装JRE环境&#xff08;推荐使用JRE8环境&am…

yolov8模型转onnx模型 和 tensorRT 模型

转onnx模型 在 安装好 pip install onnxruntime-gpu pip install onnx onnxconverter-common 出现 No module named cpuinfo 错误&#xff0c;通过安装&#xff1a; pip install py-cpuinfo 解决该问题。 import sys # 即 ultralytics文件夹 所在绝对路径 sys.path.app…

STM32 GPIO复习

GPIO General Purpose Input Output&#xff0c;即通用输入输出端口&#xff0c;简称GPIO。 负责采集外部器件的信息或控制外部器件工作&#xff0c;即输入输出。 不同型号&#xff0c;IO口数量可能不一样&#xff0c;可通过选型手册快速查询。 能快速翻转&#xff0c;每次翻…

Crimson:高性能,高扩展的新一代 Ceph OSD

背景 随着物理硬件的不断发展&#xff0c;存储软件所使用的硬件的情况也一直在不断变化。 一方面&#xff0c;内存和 IO 技术一直在快速发展&#xff0c;硬件的性能在极速增加。在最初设计 Ceph 的时候&#xff0c;通常情况下&#xff0c;Ceph 都是被部署到机械硬盘上&#x…

vellum (Discovering Houdini VellumⅡ柔体系统)学习笔记

视频地址&#xff1a; https://www.bilibili.com/video/BV1ve411u7nE?p3&spm_id_frompageDriver&vd_source044ee2998086c02fedb124921a28c963&#xff08;搬运&#xff09; 个人笔记如有错误欢迎指正&#xff1b;希望可以节省你的学习时间 ~享受艺术 干杯&#x1f37b…

Vue——如何在安卓项目中加载离线vue项目

最近在做一个离线工单的功能&#xff0c;为了直接复用原来在线H5的代码&#xff0c;我希望将它放到安卓本地来加载&#xff0c;做法比较简单&#xff0c;无非就是npm run build打包&#xff0c;然后把包放到安卓项目的assets目录下&#xff0c;然后按照正常加载webview的方式加…

jira增删改查接口

安装 pip install atlassian-python-api3.40.1 若安装失败,可尝试加上清华源(-i https://pypi.tuna.tsinghua.edu.cn/simple) 使用 为了防止信息泄露&#xff0c;可将账号密码单独存放到json文件中 &#xff0c;如credential.json {"name" : "xiaoming"…

python常用

环境配置 conda Conda自动补全 在终端激活conda环境的时候按tab不能自动补全activate和环境名。安装后可用tab进行补全。 安装 conda-bash-completion 插件&#xff1a;GitHub 安装方法&#xff1a; conda install -c conda-forge conda-bash-completion常用命令 #创建虚拟…

通过几段代码,详解Python单线程、多线程、多进程

在使用爬虫爬取数据的时候&#xff0c;当需要爬取的数据量比较大&#xff0c;且急需很快获取到数据的时候&#xff0c;可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 一、进程和线程 进程可以理解为是正在运行的程序的实例。进程是拥…

Kubernetes 使用 Rancher 管理

K8S集群管理工具 只能管理单个K8S集群 kubectl命令行管理工具 dashboard&#xff08;K8S官方的UI界面图形化管理工具&#xff09; &#xff08;管理多集群很麻烦&#xff0c;切换不同集群每次需要更改kube-config文件[kubectl配置文件]&#xff0c;如果kubeadm部署每次都需…