【回溯专题part1】【蓝桥杯备考训练】:n-皇后问题、木棒、飞机降落【已更新完成】

目录

1、n-皇后问题(回溯模板)

2、木棒(《算法竞赛进阶指南》、UVA307)

3、飞机降落(第十四届蓝桥杯省赛C++ B组)


1、n-皇后问题(回溯模板)

n皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

1_597ec77c49-8-queens.png

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

输入格式

共一行,包含整数 n。

输出格式

每个解决方案占 n 行,每行输出一个长度为 n的字符串,用来表示完整的棋盘状态。

其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。

每个方案输出完成后,输出一个空行。

注意:行末不能有多余空格。

输出方案的顺序任意,只要不重复且没有遗漏即可。

数据范围

1≤n≤9

输入样例:
4
输出样例:
.Q..
...Q
Q...
..Q.

..Q.
Q...
...Q
.Q..
思路:

经典的模板,这里的u代表行、col数组用来枚举标记列、dg用来枚举标记对角线、undg用来标记反对角线

代码:
#include<bits/stdc++.h>

using namespace std;

int n;

const int N=10;

char g[N][N];

bool col[N],dg[N],undg[N];

void dfs(int u)
{
	if(u==n)//找到一种方案 
	{
		for(int i=0;i<n;i++)puts(g[i]);
		puts("");
		return ;
	}
	for(int i=0;i<n;i++)//枚举列 
	{
		 if(!col[i]&&!dg[u+i]&&!undg[u-i+n])
		 {
		 	g[u][i]='Q';
		 	col[i]=dg[u+i]=undg[u-i+n]=true;
		 	dfs(u+1);
		 	col[i]=dg[u+i]=undg[u-i+n]=false;
		 	g[u][i]='.';
		 }
	}
}
int main()
{
	cin>>n;
	
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)g[i][j]='.';
	
	dfs(0);
	
	return 0;	
} 

2、木棒(《算法竞赛进阶指南》、UVA307)

乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过 50 个长度单位。

然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。

请你设计一个程序,帮助乔治计算木棒的可能最小长度。

每一节木棍的长度都用大于零的整数表示。

输入格式

输入包含多组数据,每组数据包括两行。

第一行是一个不超过 64 的整数,表示砍断之后共有多少节木棍。

第二行是截断以后,所得到的各节木棍的长度。

在最后一组数据之后,是一个零。

输出格式

为每组数据,分别输出原始木棒的可能最小长度,每组数据占一行。

数据范围

数据保证每一节木棍的长度均不大于 50。

输入样例:
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
输出样例:
6
5
思路:
关键剪枝条件:

1、如果上一次最终没有满足条件,回溯出来后如果我们还在拼第一根(cur==0),那么必定失败

2、如果上一次失败回溯出来后,我们正好满足现在的长度加上当前木棍长度==目标长度(cur+a[i]==len),那么必定失败

3、我们要跳过和当前长度相同的木棍,因为用这个长度必定失败

代码:
#include<bits/stdc++.h>

using namespace std;

const int N=70;

int n;

int len,sum;
int a[N];
bool st[N];//记录状态 
//cur表示当前的长度
//u表示拼接的个数 
//start表示从第几根开始拼 
bool dfs(int u,int cur,int start)
{
	if(u*len==sum)return true;//拼成所有的 
	if(cur==len)return dfs(u+1,0,0);
	for(int i=start;i<n;i++)
	{
		if(st[i])continue;
		if(cur+a[i]<=len)
		{
			st[i]=true;//表示第i根已经用过了 
			if(dfs(u,cur+a[i],i+1))return true;
			st[i]=false;
		}
		if(!cur || cur+a[i]==len)return false;//如果当前在拼新木棍或者是最后一根品好的木棍 
		int j=i+1;
		while(j<n && a[j]==a[i])j++;//跳过长度相同的木棍 
		i=j-1;
	}
	return false;
}

int main()
{
	while(cin>>n,n!=0)
	{
		len=sum=0;
		memset(st,false,sizeof st);
		for(int i=0;i<n;i++)
		{
			cin>>a[i];	
			sum+=a[i];
			len=max(len,a[i]);
		} 
		
		sort(a,a+n,greater<int>());
		while(true)
		{
			if(sum%len==0 && dfs(0,0,0))
			{
			    cout<<len<<endl;
			    break;
			}
			len++;
		}
	}
	
	
	return 0;	
} 

3、飞机降落(第十四届蓝桥杯省赛C++ B组)

有 N 架飞机准备降落到某个只有一条跑道的机场。

其中第 i 架飞机在 Ti时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早可以于 Ti 时刻开始降落,最晚可以于 Ti+Di 时刻开始降落。

降落过程需要 Li个单位时间。

一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。

请你判断 N 架飞机是否可以全部安全降落。

输入格式

输入包含多组数据。

第一行包含一个整数 T,代表测试数据的组数。

对于每组数据,第一行包含一个整数 N。

以下 N 行,每行包含三个整数:Ti,Di 和 Li。

输出格式

对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。

数据范围

对于 30% 的数据,N≤2。
对于 100% 的数据,1≤T≤10,1≤N≤10,0≤Ti,Di,Li≤1e5。

输入样例:
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20
输出样例:
YES
NO
样例解释

对于第一组数据,可以安排第 3 架飞机于 0 时刻开始降落,20 时刻完成降落。安排第 2 架飞机于 20时刻开始降落,30 时刻完成降落。安排第 1 架飞机于 30 时刻开始降落,40 时刻完成降落。

对于第二组数据,无论如何安排,都会有飞机不能及时降落。

思路:

关键:我们飞机最可以降落的最早时间是max(last,t)+l,因为就算飞机可以降落了,上一个飞机没有降落完成也是不行的,必须等到last结束才能降落,所以上上一辆飞机降落的时间取为max(last,t)+l

代码:
#include<bits/stdc++.h>

using namespace std;

const int N=20;

struct plane
{
	int t,d,l;
}p[N]; 

int k,n;
int t[N],d[N],l[N];
bool st[N];

//bool cmp(plane a,plane b)
//{
//	return a.t<b.t;
//}

bool dfs(int cnt,int last)
{
	if(cnt>=n)//飞机达到数量 
	{
		return true;
	}
	for(int i=0;i<n;i++)
	{
		int t=p[i].t;
		int d=p[i].d;
		int l=p[i].l;
		if(!st[i] && t+d>=last)
		{
			st[i]=true;
			if(dfs(cnt+1,max(last,t)+l))return true;
			st[i]=false;
		}
	}
	return false;
}

int main()
{
	cin>>k;
	while(k--)
	{
		cin>>n;
		for(int i=0;i<n;i++)
		{
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			p[i]={a,b,c};
		}
		memset(st,false,sizeof st);
		if(dfs(0,0))cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;	
} 

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

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

相关文章

通过Anaconda安装Python会得到的重要文件夹

E:\Anaconda\路径下 Scripts 文件夹&#xff1a;该文件夹包含了可执行的Python脚本文件&#xff0c;例如pip和conda等命令行工具。【pip3.exe和django-admin.exe等】Lib 文件夹&#xff1a;该文件夹包含了Python的标准库和其他第三方库的源代码文件。【Lib下面的site-packages…

农业四情监测系统的工作原理

农业四情监测系统的工作原理【TH-Q1】农业四情监测系统是一种应用现代科技手段&#xff0c;以实现对农田环境信息的实时监测和数据采集的系统。这一系统通过对农田的土壤、气象、病虫害以及作物生长状况等四个方面的实时监测&#xff0c;帮助农民和农业管理者更好地了解和掌握农…

力扣● 503.下一个更大元素II ● 42. 接雨水

503.下一个更大元素II 与496.下一个更大元素 I的不同是要循环地搜索元素的下一个更大的数。那么主要是对于遍历结束后&#xff0c;单调栈里面剩下的那些元素。 如果直接把两个数组拼接在一起&#xff0c;然后使用单调栈求下一个最大值就可以。 代码实现的话&#xff0c;不用直…

电脑笔记软件与桌面备忘录的高效设置指南

在数字化生活的大潮中&#xff0c;电脑笔记软件和桌面备忘录已成为我们日常信息管理与时间规划的重要载体。它们犹如你的私人智囊团&#xff0c;随时随地帮你记录灵感、整理思路、规划任务。本文将深度解析电脑笔记软件的多元功能&#xff0c;并手把手教你如何设置实用的电脑桌…

Kotlin函数进阶玩法

公众号「稀有猿诉」 原文链接 More about Kotlin Functions Kotlin中的函数是一级对象&#xff0c;除了常规的函数式编程以外&#xff0c;还支持一些非常灵活的特殊用法&#xff0c;可以大大增强代码的可读性和简洁性&#xff0c;让代码更加的优雅&#xff0c;在业界顶级…

第6讲-MIPS处理器(3)MIPS单周期处理器设计

三. MIPS单周期处理器设计 1.单周期数据通路设计 2.单周期控制器设计 3.单周期性能分析

阿里云服务器ECS经济型e实例2核2G优惠价格99元一年性能测试

阿里云服务器99元一年配置为云服务器ECS经济型e实例&#xff0c;2核2G配置、3M固定带宽和40G ESSD Entry系统盘&#xff0c;新用户和老用户均可买&#xff0c;续费不涨价依旧是99元一年&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云99元服务器性能测评&#xff…

碳素光线疗法——动,植物 光育实验

碳素光线疗法——动&#xff0c;植物 光育实验 碳素光线疗法&#xff1a; 中西医、民间疗法融为一体&#xff0c;提高机体自身治愈力&#xff0c;免疫力&#xff0c;改善体质和保持健康&#xff0c;有助于疾病的预防和治疗的疗法。不吃药、不打针、不手术也能得健康&#xff0c…

HCIP的学习(3)

网络类型及数据链路层协议 网络类型分类 P2P网络----点到点网络类型MA网络-----多点接入网络 BMA----广播型多点接入网络NBMA—非广播型多点接入网络&#xff08;快淘汰了&#xff09; 数据链路层协议 MA网络 以太网协议 特点&#xff1a;需要使用MAC地址对设备进行区分…

经济事件对我们投资没影响吗?昂首资本的这两个实例说明白再说

各位投资者现在还不明白经济事件对我们投资的影响吗&#xff1f;下面昂首资本就通过两个实例&#xff0c;各位投资者能否明白经济事件对我们投资的影响。 2015年6月4日&#xff0c;澳大利亚零售量新闻发布。分析师预计销量增幅高达0.4%&#xff0c;但是结果却大吃一惊&#xf…

第四百一十七回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义标题栏"相关的内容&#xff0c;本章回中将介绍自定义Action菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里提到的…

【代码学习】Mediapipe人脸检测使用记录

Mediapipe&#xff0c;每秒200-300帧的实时人脸检测&#xff0c;提取画面中的人脸框&#xff0c;实现后续各种应用&#xff1a;人脸属性识别、表情识别、关键点检测、三维重建、增强现实、AI换妆等 code&#xff1a;google/mediapipe: Cross-platform, customizable ML soluti…

【NLP】从变形金刚到Transfomer 01

Transformer是一种非常强大的模型&#xff0c;在自然语言处理&#xff08;NLP&#xff09;领域里引起了一场革命。 "从变形金刚到技术革命家&#xff0c;Transformer不再仅是儿时屏幕上的英雄。&#x1f916;✨ 在今天的AI领域&#xff0c;它变身成为自然语言处理的超级英…

MySQL数据库存储引擎MyISAM与InnoDB

前言 MySQL存储引擎是MySQL数据库中负责管理数据存储和检索的组件&#xff0c;不同的存储引擎提供了不同的功能和特性&#xff0c;可以根据实际需求选择合适的存储引擎来优化数据库性能和功能。以下是一些常见的MySQL存储引擎&#xff1a;InnoDB、MyISAM、MEMORY、NDB Cluster…

论文阅读-MIPD:一种用于分布式深度神经网络训练的自适应梯度稀疏化框架

摘要—基于参数服务器架构的异步训练广泛应用于大规模数据集和深度神经网络模型的扩展训练。在大规模分布式深度学习系统中&#xff0c;通信一直被认为是主要瓶颈。最近的研究尝试通过梯度稀疏化和量化方法来减少通信流量。我们发现前期研究存在三个限制。首先&#xff0c;他们…

【基础+进阶】Midjourney订阅看这一篇就够了!Midjourney进阶关键词用法!Midjourney常见问题!

Midjourney进阶关键词用法 1.风格 设计/流派 可以使用一些关键词作为设计流派风格&#xff0c;例如standard,Japanese anime style,Pixar movie style,cyber punk style等 艺术家的姓名 可以使用一些艺术家的姓名作为风格&#xff0c;例如Andy Warhol,Da Vinci等 渲染/照明…

​浅析多模态大模型技术路线梳理

前段时间 ChatGPT 进行了一轮重大更新&#xff1a;多模态上线&#xff0c;能说话&#xff0c;会看图&#xff01;微软发了一篇长达 166 页的 GPT-4V 测评论文&#xff0c;一时间又带起了一阵多模态的热议&#xff0c;随后像是 LLaVA-1.5、CogVLM、MiniGPT-5 等研究工作紧随其后…

【系统架构师】-第6章-数据库设计基础知识

1、三级模式-两级映像 外模式&#xff1a;视图、用户与数据库的接口 概念模式&#xff1a;表 内模式&#xff1a;存储方式&#xff0c;索引创建等 1&#xff09;外模式-模式映射&#xff1a; 视图与表的映射&#xff0c;表数据发生修改&#xff0c;只需要修改映射&#xf…

探索ChatGPT时代下的下一代信息检索系统:机遇与挑战

1 Introduction 2022 年 11 月 30 日&#xff0c;OpenAI 推出了 ChatGPT&#xff0c;这是一款由先进的 GPT3.5 和更高版本的 GPT-4 生成语言模型提供支持的 AI 聊天机器人应用程序。该应用迅速吸引了全球超亿用户&#xff0c;创下了产品快速传播的新纪录。 它能够以对话的方式…

【Linux系统编程】文件系统

进程与文件 当我们对文件进行操作时&#xff0c;文件必须要被加载到内存中&#xff0c;然后CUP从内存中拿到此文件进行操作&#xff0c;没有打开的文件放在磁盘中存储。 文件的打开其实也是设计到内部某个进程。无论是系统调用&#xff0c;还是专有库中的函数&#xff0c;都是…