Part 3.1 深度优先搜索

深度优先搜索(DFS),即按照深度优先的顺序搜索的算法。

深度优先搜索一般使用栈来实现。

[USACO1.5] 八皇后 Checker Challenge

题目描述

一个如下的 6 × 6 6 \times 6 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

上面的布局可以用序列 2 4 6 1 3 5 2\ 4\ 6\ 1\ 3\ 5 2 4 6 1 3 5 来描述,第 i i i 个数字表示在第 i i i 行的相应位置有一个棋子,如下:

行号 1 2 3 4 5 6 1\ 2\ 3\ 4\ 5\ 6 1 2 3 4 5 6

列号 2 4 6 1 3 5 2\ 4\ 6\ 1\ 3\ 5 2 4 6 1 3 5

这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。
并把它们以上面的序列方法输出,解按字典顺序排列。
请输出前 3 3 3 个解。最后一行是解的总个数。

输入格式

一行一个正整数 n n n,表示棋盘是 n × n n \times n n×n 大小的。

输出格式

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

样例 #1

样例输入 #1

6

样例输出 #1

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

提示

【数据范围】
对于 100 % 100\% 100% 的数据, 6 ≤ n ≤ 13 6 \le n \le 13 6n13

题目翻译来自NOCOW。

USACO Training Section 1.5

代码实现

#include<iostream>
using namespace std;
#define MAX_N 13
int ans[MAX_N+5];
int vis_col[MAX_N+5]={0},vis_dui1[MAX_N*2+5]={0},vis_dui2[MAX_N*2+5];
int n,cnt=0;
void dfs(int row)
{if(row==n+1){cnt++;if(cnt<=3){for(int i=1;i<=n;i++){if(i!=1)cout<<" ";cout<<ans[i];}cout<<endl;}return ;}for(int i=1;i<=n;i++){if(vis_col[i])continue;if(vis_dui1[i-row+n])continue;if(vis_dui2[i+row-1])continue;vis_col[i]=1;vis_dui1[i-row+n]=1;vis_dui2[i+row-1]=1;ans[row]=i;dfs(row+1);vis_col[i]=0;vis_dui1[i-row+n]=0;vis_dui2[i+row-1]=0;}
}
int main()
{cin>>n;dfs(1);cout<<cnt;return 0;} 

[NOIP2000 提高组] 单词接龙

题目背景

注意:本题为上古 NOIP 原题,不保证存在靠谱的做法能通过该数据范围下的所有数据。

本题为搜索题,本题不接受 hack 数据。关于此类题目的详细内容

NOIP2000 提高组 T3

题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beastastonish,如果接成一条龙则变为 beastonish,另外相邻的两部分不能存在包含关系,例如 atatide 间不能相连。

输入格式

输入的第一行为一个单独的整数 n n n 表示单词数,以下 n n n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。

输出格式

只需输出以此字母开头的最长的“龙”的长度。

样例 #1

样例输入 #1

5
at
touch
cheat
choose
tact
a

样例输出 #1

23

提示

样例解释:连成的“龙”为 atoucheatactactouchoose

n ≤ 20 n \le 20 n20

代码实现

#include<iostream>
#include<vector>
using namespace std;
#define MAX_N 20
string arr[MAX_N+5];
int to[MAX_N+5][MAX_N+5];
int cnt[MAX_N+5]={0};
vector<int>start;
int n;
int final_ans=0;
void dfs(int k,int ans)
{final_ans=max(final_ans,ans);for(int i=1;i<=n;i++){if(to[k][i]&&cnt[i]!=2){cnt[i]++;		dfs(i,ans+arr[i].size()-to[k][i]);cnt[i]--;}}return ;
}
int main()
{cin>>n;char st;for(int i=1;i<=n;i++)cin>>arr[i];cin>>st;for(int i=1;i<=n;i++){if(arr[i][0]==st)start.push_back(i);for(int j=1;j<=n;j++){int max_len=min(arr[i].size(),arr[j].size());for(int len=1;len<=max_len;len++){int j_pos=len-1;int flag=1;int sz=arr[i].size();for(int k=sz-1;k>=(sz-len);k--){if(arr[i][k]==arr[j][j_pos--])continue;flag=0;break;}if(flag){if(len==max_len)break;to[i][j]=len;break;}}}}for(auto fir:start){cnt[fir]+=1;dfs(fir,arr[fir].size());cnt[fir]-=1;}cout<<final_ans;return 0;
}

[USACO05DEC] Scales S

题目描述

约翰有一架用来称牛的体重的天平。与之配套的是 $ N \ ( 1 \leq N \leq 1000 ) $ 个已知质量的砝码(所有砝码质量的数值都在 32 32 32 位带符号整数范围内)。

每次称牛时,他都把某头奶牛安置在天平的某一边,然后往天平另一边加砝码,直到天平平衡,于是此时砝码的总质量就是牛的质量(约翰不能把砝码放到奶牛的那边,因为奶牛不喜欢称体重,每当约翰把砝码放到她的蹄子底下,她就会尝试把砝码踢到约翰脸上)。

天平能承受的物体的质量不是无限的,当天平某一边物体的质量大于 $ C \ ( 1 \leq C \leq 2^{30} ) $ 时,天平就会被损坏。砝码按照它们质量的大小被排成一行。并且,这一行中从第 3 3 3 个砝码开始,每个砝码的质量至少等于前面两个砝码(也就是质量比它小的砝码中质量最大的两个)的质量的和。

约翰想知道,用他所拥有的这些砝码以及这架天平,能称出的质量最大是多少。由于天平的最大承重能力为 C C C,他不能把所有砝码都放到天平上。

现在约翰告诉你每个砝码的质量,以及天平能承受的最大质量,你的任务是选出一些砝码,使它们的质量和在不压坏天平的前提下是所有组合中最大的。

输入格式

1 1 1 行输入两个用空格隔开的正整数 $ N $ 和 $ C $。

2 2 2 到 $ N+1 $ 行:每一行仅包含一个正整数,即某个砝码的质量。保证这些砝码的质量是一个不下降序列。

输出格式

输出一个正整数,表示用所给的砝码能称出的不压坏天平的最大质量。

样例 #1

样例输入 #1

3 15
1
10
20

样例输出 #1

11

代码实现

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX_N 1000
int fama[MAX_N+5];
int final_ans=0;	
int n,c;
bool cmp(int a,int b)
{return a>b;
}
void dfs(int i,int ans)
{if(i==n){final_ans=max(final_ans,ans);return ;}if(ans+fama[i+1]<=c)dfs(i+1,ans+fama[i+1]);if(ans+fama[i+1]+fama[i+2]>c)dfs(i+1,ans);return ;
}
int main()
{cin>>n>>c;for(int i=1;i<=n;i++)cin>>fama[i];sort(fama+1,fama+1+n,cmp);dfs(0,0);cout<<final_ans;return 0;} 

【XR-2】奇迹

题目背景

相信奇迹的人,本身就和奇迹一样了不起。——笛亚 《星游记》

题目描述

我们称一个日期为一个八位数,第 1~4 位构成年,第 5~6 位构成月,第 7~8 位构成日,不足位数用 0 补足。同时,要求日期所代表的这一天真实存在,且年的范围为 1~9999。

出现奇迹的日期都存在相同的特点:由“日”组成的两位数,由“月+日”组成的四位数,由“年+月+日”组成的八位数均为质数。但并不是所有存在这样特点的日期都一定会出现奇迹。

现在,你得到了一个可能会出现奇迹的日期,然而不幸的是这个日期却是残缺的,八位中可能有若干位无法确定。你需要知道这个日期有多少种可能,这样你才能做好充足的准备去迎接奇迹的到来。

输入格式

本题有多组数据。

第一行一个正整数 T T T,表示数据组数。

接下来的 T T T 行,每行一个八位字符串。其中第 i i i 位如果为 -,则表示日期的第 i i i 位无法确定,否则表示日期的第 i i i 位为字符串中第 i i i 位上的数字。

输出格式

对每组数据,一行一个整数,表示答案。

样例 #1

样例输入 #1

2
53-7-3-7
20190629

样例输出 #1

6
0

提示

【样例 1 1 1 说明】

53-7-3-7 6 6 6 种可能的日期如下:

53070307
53070317
53170307
53370307
53570317
53770307

【数据规模与约定】

一共 10 10 10 个测试点,记 c c c 为八位字符串中 - 的个数。

对前 9 9 9 个测试点,在第 i i i 个测试点中保证 c = i − 1 c = i - 1 c=i1

100 % 100\% 100% 的数据保证 1 ≤ T ≤ 10 1 \le T \le 10 1T10

代码实现

#include<iostream>
#include<math.h>
using namespace std;
#define MAXSIZE 10000005
int prim[10005],zhishu[10005],vis[10005],runnian[10005];
int m_to_d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int ans=0;
int cnt=0;
int s[9];
void Init()
{for(int i=2;i<=10005;i++){if(!vis[i]){prim[++cnt]=i;zhishu[i]=1;vis[i]=1;}for(int j=1;j<=cnt;j++){if(i*prim[j]>10005)break;vis[prim[j]*i]=1;if(i%prim[j]==0)break;}}for(int i=1;i<=9999;i++){if(i%4==0)if(i%100!=0)runnian[i]=1;else if(i%400==0)runnian[i]=1;}return ;
}
bool pdzs(int x)
{if(x < 2) return 0;for(int i= 1; i <= cnt; i++)if(x % prim[i] == 0) return x == prim[i];return 1;
}
void dfs(int pos,int num,int rn,int dy)
{if(pos==0){if(num<=1231)return ;if(rn==1&&!runnian[num/10000])return ;if(pdzs(num))ans++;return ;}if(pos==4){if(num<31||num>1231)return ;if(dy==1&&m_to_d[num/100]!=31)return ;if(!pdzs(num))return ;if(num%100==29&&num/100==2)rn=1;}if(pos==6){if(num==0||num>31)return ;if(!pdzs(num)) return ;if(num==31)dy=1;}if(s[pos]==-1)for(int i=0;i<=9;i++)dfs(pos-1,num+i*pow(10,8-pos),rn,dy); else dfs(pos-1,num+s[pos]*pow(10,8-pos),rn,dy);
}
int main()
{int t;cin>>t;Init();while(t--){ans=0;char c;for(int i=1;i<=8;i++){cin>>c;s[i]=(c=='-'?-1:c-'0');}dfs(8,0,0,0);cout<<ans<<endl;}return 0;} 

油滴扩展

题目描述

在一个长方形框子里,最多有 N N N 个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界。必须等一个油滴扩展完毕才能放置下一个油滴。那么应该按照怎样的顺序在这 N N N 个点上放置油滴,才能使放置完毕后所有油滴占据的总面积最大呢?(不同的油滴不会相互融合)

注:圆的面积公式 S = π r 2 S = \pi r^2 S=πr2,其中 r r r 为圆的半径。

输入格式

第一行,一个整数 N N N

第二行,四个整数 x , y , x ′ , y ′ x, y, x', y' x,y,x,y,表示长方形边框一个顶点及其对角顶点的坐标。

接下来 N N N 行,第 i i i 行两个整数 x i , y i x_i, y_i xi,yi,表示盒子内第 i i i 个点的坐标。

输出格式

一行,一个整数,长方形盒子剩余的最小空间(结果四舍五入输出)。

样例 #1

样例输入 #1

2
20 0 10 10
13 3
17 7

样例输出 #1

50

提示

代码实现

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 6 1 \le N \le 6 1N6,坐标范围在 [ − 1000 , 1000 ] [-1000, 1000] [1000,1000] 内。

#include<iostream>
#include<math.h>
using namespace std;
#define PI 3.1415926535
double x[10],y[10],r[10];
double xa,xb,ya,yb;
double s;
double yd=0;
int vis[10],w[10];
int n;
double dis(int a,int b)
{return sqrt(pow(x[a]-x[b],2)+pow(y[a]-y[b],2));
}
void dfs(int id,double num)
{if(id==n+1){	yd=max(yd,num);return ;}for(int i=1;i<=n;i++){if(vis[i])continue;vis[i]=1;w[id]=i;r[id]=1000000;r[id]=min(r[id],fabs(xa-x[i]));r[id]=min(r[id],fabs(xb-x[i]));r[id]=min(r[id],fabs(ya-y[i]));r[id]=min(r[id],fabs(yb-y[i]));for(int j=1;j<id;j++){double dd=dis(w[id],w[j]);if(dd<=r[j]){r[id]=0;break;}r[id]=min(r[id],dd-r[j]);}dfs(id+1,num+PI*r[id]*r[id]);vis[i]=0;}return ;
}
int main()
{cin>>n;cin>>xa>>ya>>xb>>yb;s=fabs(xa-xb)*fabs(ya-yb);for(int i=1;i<=n;i++)r[i]=1000000;for(int i=1;i<=n;i++)cin>>x[i]>>y[i];dfs(1,0);s-=yd;printf("%.0lf",s);//自带四舍五入 return 0;
} 

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

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

相关文章

go解析yaml

go解析yaml文件关键就是结构体的创建 初学go tag字段要和yaml文件中的key对应起来&#xff0c;每个层级都要创建对应的结构体&#xff0c;有点烦 package configimport ("gopkg.in/yaml.v3""os" )type Config struct {MysqlConfig MysqlConfig yaml:&q…

开发nfc读卡器应用出现报错Unhandled Exception: SCARD_E_NO_SERVICE

使用flutter开发ACR122U的nfc读卡器的时候&#xff0c;报错&#xff1a; [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Exception: Error while establing context. Reason: SCARD_E_NO_SERVICE #0 PCSCBinding._checkAndThrow (package:fl…

Flink实现实时异常登陆监控(两秒内多次登陆失败进行异常行为标记)

Flink实现异常登陆监控&#xff08;两秒内多次登陆失败进行异常行为标记&#xff09; 在大数据处理领域&#xff0c;Apache Flink 是一个流行的开源流处理框架&#xff0c;能够高效处理实时数据流。在这篇博客中&#xff0c;我们将展示如何使用 Apache Flink 从 MySQL 中读取数…

科研数据分析常见问题

许多使用SPSSAU进行初次科研数据分析的同学&#xff0c;可能对数据分析方法的深层原理和研究思路缺乏全面的把握。因此&#xff0c;当导师针对数据研究方法提出具体问题时&#xff0c;他们可能会感到些许困惑或难以立即给出满意的答复。鉴于此&#xff0c;SPSSAU汇总了一些常见…

【工具】创客贴会员|创客贴截止2024年6月所有AI功能效果实测(热门推荐和图片编辑部分)

上一篇&#xff1a;【工具】创客贴会员&#xff5c;万字测评&#xff01;前沿设计网站创客贴的 AI 文生图效果测评 上一篇写的时候只测了文生图&#xff0c;因为百度那边活动没和创客贴接洽好&#xff0c;他们不清楚创客贴的AI和其他会员功能分开了&#xff0c;导致只有10次体…

virtualbox中ubuntu22.04网络配置

第一&#xff1a;添加两个网卡&#xff0c;网卡1是NAT方式&#xff0c;网卡2是仅主机模式&#xff08;两个顺序不能颠倒&#xff09; 第二步&#xff1a;启动ifconfig查看网络

搭载昇腾310NPU的Orange Pi AIpro开箱体验以及深度学习样例测试

Orange Pi AIpro开箱体验以及样例测试 随着人工智能和物联网技术的快速发展&#xff0c;单板计算机&#xff08;Single Board Computer, SBC&#xff09;在创客和开发者社区中越来越受到欢迎。我最近入手了一款高性能的单板计算机——Orange Pi AIpro。 在入手此款AI开发板之…

探索 Ollama: 你的本地 AI 助手

本期推荐的开源项目是 Ollama&#xff0c;它是一款本地大模型运行工具&#xff0c;可以帮助用户轻松下载和运行各种大型语言模型&#xff08;LLM&#xff09;&#xff0c;而无需将数据上传到云端。以下是关于 Ollama 的介绍以及安装和使用教程&#xff1a; Ollama 是什么&#…

VB.net 进行CAD二次开发(二)

利用参考文献2&#xff0c;添加面板 执行treeControl New UCTreeView()时报一个错误&#xff1a; 用户代码未处理 System.ArgumentException HResult-2147024809 Message控件不支持透明的背景色。 SourceSystem.Windows.Forms StackTrace: 在 System.Windows…

Spring事务管理进阶-rollbackFor propagation

黑马程序员JavaWeb开发教程 文章目录 一、rollbackFor二、propagation2.1 事务传播行为2.2 场景 一、rollbackFor 默认情况下&#xff0c;只有初选RuntimeException才会回滚异常。roolbackFor属性用于控制出现何种异常类型&#xff0c;回滚事务。 二、propagation 用来配置事…

网络安全基础技术扫盲篇 — 名词解释之“数据包“

用通俗易懂的话说&#xff1a; 数据包就像是一个信封。当你写信给某个人时&#xff0c;你将内容写在一张纸上&#xff0c;然后将纸叠起来并放入信封中&#xff0c;就形成了一个完整要发送的数据内容。信封上有发件人和收件人的详细地址&#xff0c;还有一些其他必要的信息&…

Java项目:93 springboot学生评奖评优管理系统的设计与实现

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本学生评奖评优管理系统有管理员和教师和学生。 管理员功能有个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;院系信息管理&a…

规则引擎Drools,基于mysql实现动态加载部署

文章目录 一、使用1、参考资料2、引包3、创建规则实体类4、实现drools动态规则5、模拟数据库&#xff0c;实现规则的CRUD6、创建控制层7、测试规则的动态添加&#xff08;1&#xff09;添加规则&#xff08;2&#xff09;修改规则&#xff08;3&#xff09;删除规则 8、模拟2个…

蓝桥杯单片机-国赛7——第十四届主观题代码参考

0.编程心得 本题中&#xff0c;要求测距能达到250cm&#xff0c;因此pca必须配置为0x01&#xff0c;但直接用会死机&#xff0c;因此需要使用CH作为判断量。 【iic的at24c02记录】&#xff1a; 读设备地址&#xff1a;0xA1 写设备地址&#xff1a;0xA0 非应答信号&#xff1…

【Linux】Linux基本指令3

目录 1.date指令 2.cal指令 3.find指令&#xff1a;&#xff08;灰常重要&#xff09; -name 4.grep指令——行文本过滤工具 5.zip/unzip指令&#xff1a; 6.tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包&#xff0c;不打开它&#xff0c;直接看内容 7.bc…

Dinky DorisCDC 整库同步到 Doris

doris flinkcdc语法参考 Flink Doris Connector - Apache Doris 参考&#xff1a; Doris Flink DolphinScheduler Dinky 构建开源数据平台_dinky dolphinscheduler flink-CSDN博客

2024年,抖音小店618十大爆款预测!商家抓紧时间上架!

哈喽~我是电商月月 做电商的玩家都知道&#xff0c;一但到了换季或者是节日大促的时候&#xff0c;销量高&#xff0c;是最容易爆单的阶段 而提前上架一些热卖产品&#xff0c;爆单的几率在自己的店铺机会就越大 而最近的一个大型活动&#xff0c;就是618了&#xff0c;抖音…

只出现一次的数字II ---- 位运算

题目链接 题目: 分析: 对于只出现一次的数字, 他的任意一个bit位, 可能是0或1对于其余出现3次的数字, 假设有3n个数, 那么他们的任意一个bit相加的和可能是3n个0或3n个1那么对于数组中的全部数字的任意一个bit位之和共有三种情况: 3n个1 1 3n13n个0 1 13n个1 0 3n3n个0…

华为认证学习笔记:生成树

以太网交换网络中为了进行链路备份&#xff0c;提高网络可靠性&#xff0c;通常会使用冗余链路。但是使用冗余链路会在交换网络上产生环路&#xff0c;引发广播风暴以及MAC地址表不稳定等故障现象&#xff0c;从而导致用户通信质量较差&#xff0c;甚至通信中断。为解决交换网络…

如何限制上网行为?上网行为管控软件有什么功能?

上网行为的管理与限制对于保障企业安全、提高员工工作效率以及保护孩子健康成长都显得尤为重要。 上网行为管控软件作为一种专业的工具&#xff0c;在这方面发挥着不可替代的作用。 本文将探讨如何限制上网行为&#xff0c;并介绍上网行为管控软件的主要功能。 一、如何限制上…