2021-01-20 总结

本文介绍了使用搜索算法解决八皇后问题和自然数拆分问题。通过示例代码详细阐述了如何利用递归和回溯实现解题过程,同时探讨了保证序列按字典序输出的策略。

2021-01-20 总结

今天的课收获颇多,对于我这么一个搜索学的一知半解的人来说,这样一节搜索的强化课对我实在是太有帮助了,虽然现在离精通还有很远,但是至少我已经能独立写出一些思维难度比较简单的搜索题了。总之,今天真是收获满满。
1.八皇后

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

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

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

输入格式
一行一个正整数 n,表示棋盘是 n×n 大小的。

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

输入输出样例
输入
6
输出
2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

八皇后的原题我在网上没找到,只好拿 n 皇后的题来凑合了,也以这道题为例谈一谈搜索。
这道题因为皇后可以吃掉八个方向上的棋子,也就意味着皇后的八个方向上是不能再放皇后的,所以我的思路就是每放一个皇后,就把这个皇后八个方向上的所有位置都打上标记,下一次再放皇后时,就找没有打上标记的地方放。
接下来是代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a[20],b[20],c[20],d[20];
int ans;
void print(){
	for(int i=1;i<=8;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	ans++;//累加器,用于记录解的个数;
} 
void cwy(int i){
	if(i>8){//边界条件的判断; 
		print();
		return;
	}
	for(int j=1;j<=8;j++){
		if(b[j]==0&&c[i+j]==0&&d[i-j+8]==0){//条件判断;
			a[i]=j;b[j]=1;c[i+j]=1;d[i+8-j]=1;//给不能放皇后的地方打上标记; 
			cwy(i+1);
			b[j]=0;c[i+j]=0;d[i-j+8]=0;//回溯,去掉标记; 
		}
	}
}
int main()
{
	cwy(1);
	printf("**%d**",ans);
	return 0;
}

至于 n 皇后,实际上和八皇后一模一样,只是把 8 都改成了 n 。。。
不过为了练搜索,我还是又写了一遍。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,ans;
int a[100001],b[100001],c[100001],d[100001];
void print()
{
	if(ans<=2){
		for(int i=1;i<=n;i++){
			printf("%d ",a[i]);
		}
		printf("\n");
	}
	
	ans++;
}
void cwy(int i)
{
	if(i>n){
		print();
		return;
	}
	for(int j=1;j<=n;j++){
		if(b[j]==0&&c[j+i]==0&&d[i-j+n]==0){
			b[j]=1;c[j+i]=1;d[i-j+n]=1;
			a[i]=j;
			cwy(i+1);
			b[j]=0;c[j+i]=0;d[i-j+n]=0;
		}
	}
}
int main()
{
	scanf("%d",&n);
	cwy(1);
	printf("%d",ans);
	return 0;
}

2.自然数的拆分问题

题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。

输入格式
输入:待拆分的自然数n。

输出格式
输出:若干数的加法式子。

输入输出样例
输入
7
输出
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

这道自然数的拆分问题,总结起来有两个要点,一是每个拆分的序列中,数字需要按从小到大的顺序输出;二是序列要按照字典序的顺序输出。第二点比较好解决,搜索中的循环从 1 开始即可,第一点可以通过每次循环存一下这层循环所取的值,并在下一层循环中从这一个值开始循环(由于本题本身就需要存每一层循环所取的值,所以顺带就把这项工作做了),这样就可以保证下一次循环中所取的值不小于这一层循环所取的值,进而使数字按从小到大的顺序输出。另外,如果把第二点做好,就不用考虑输出重复的问题了。
代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[10001]={1},sum,y,vis[10001];
void print(int);
void cwy(int x,int y){
//x代表还有多少数可以拆;
//y代表层数;
	if(x==0){
		print(y);
	}
	for(int i=a[y-1]/*从上一次存入的值开始这一次循环,保证数字按照从小到大的顺序输出;;*/;i<=x&&i<n;i++){
		a[y]=i;//存当前循环所取的值;
		x-=i;
		cwy(x,y+1);
		x+=i;//回溯;
	}
}
void print(int y){
	printf("%d=",n);
	for(int i=1;i<=y-2;i++){
		printf("%d+",a[i]);
	}
	printf("%d\n",a[y-1]);
}
int main()
{
	scanf("%d",&n);
	cwy(n,1);
	return 0;
}

今天就写到这,有关汉诺塔的问题明天再写,我得去狂肝作业了。

内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
<think>好的,用户现在问的是如何用Pandas将“2021-01-01”转换为日期格式。之前他们的问题是关于Excel筛选日期,现在转向了Pandas,说明用户可能在处理数据时从Excel转到了Python环境,或者需要更强大的数据处理能力。 首先,我需要确定用户的实际需求。他们提到的是将特定的字符串转换为日期格式,但可能实际的数据集中有类似格式的日期字符串需要批量转换。用户可能对Pandas的日期处理不太熟悉,尤其是如何正确使用to_datetime函数。 接下来,我应该考虑用户可能遇到的常见问题。比如,日期格式是否正确,是否有缺失值,或者数据列中存在非日期字符串的情况。此外,用户可能不知道如何指定格式,或者是否需要处理时区问题。 然后,需要提供具体的步骤。使用pd.to_datetime是最直接的方法,但需要解释参数,比如format的作用,以及如何处理错误。同时,给出示例代码和输出,让用户能够直观地看到转换前后的变化。 可能用户的数据集较大,或者有多个列需要转换,这时候可能需要指导他们如何应用到整个DataFrame。此外,用户可能在转换后需要提取年、月、日等信息,这也是常见的后续操作,可以简要提及。 还要注意常见的错误情况,比如格式不匹配导致转换失败,或者如何强制转换为NaT。这能帮助用户在实际操作中避免问题。 最后,总结关键点,强调格式参数的重要性,错误处理的选项,以及如何验证转换结果。确保用户理解每个步骤的作用,能够举一反三应用到自己的数据中。</think>在Pandas中将字符串转换为日期格式,推荐使用 `pd.to_datetime()` 函数,以下是详细步骤: --- ### 方法一:直接转换 ```python import pandas as pd # 示例数据 date_str = "2021-01-01" # 转换单个字符串 date_obj = pd.to_datetime(date_str) print(date_obj) # 输出:2021-01-01 00:00:00 ``` --- ### 方法二:处理DataFrame列 当处理DataFrame列时(假设列名为`date_column`): ```python import pandas as pd # 创建示例数据 df = pd.DataFrame({ "date_column": ["2021-01-01", "2021-02-15", "2021-03-20"] }) # 转换整列数据 df["date_column"] = pd.to_datetime(df["date_column"], format="%Y-%m-%d") # 验证结果 print(df.dtypes) # 输出:date_column datetime64[ns] ``` --- ### 关键参数说明 1. **`format` 参数**(强烈建议指定): ```python pd.to_datetime(..., format="%Y-%m-%d") ``` - `%Y`:4位年份(如2021- `%m`:2位月份(01-12) - `%d`:2位日期(01-31) 2. **错误处理**: ```python # 转换失败时返回NaT(Not a Time) pd.to_datetime(..., errors="coerce") # 直接忽略错误 pd.to_datetime(..., errors="ignore") ``` --- ### 验证转换结果 ```python # 检查是否转换为datetime类型 print(type(df["date_column"][0])) # 输出:<c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值