coj1090: Number Transformation bfs

本文介绍了一种使用广度优先搜索(BFS)算法来解决整数转换问题的方法,即从一个整数S通过逐步加上小于当前数值的素数转换到另一个整数T的过程。文章详细解释了题目的背景,并提供了具体的实现代码。

这道题用bfs做,一开始没理解清题意WA的不要不要的,后来仔细看题发现A是一步变一次的,也就是说每次可以加的素数的范围是改变的,比如当S=5,T=20的时候,S先加3=8,然后此时可以取的素数就不仅有2、3,还有5、7了,一开始不仔细看题真是醉了。

Description

 In this problem, you are given a pair of integers A and B. You can transform any integer number A to B by adding x to A.This x is an integer number which is a prime below A.Now,your task is to find the minimum number of transformation required to transform S to another integer number T.

Input

 Input contains multiple test cases.Each test case contains a pair of integers S and T(0< S < T <= 1000) , one pair of integers per line. 

Output

 For each pair of input integers S and T you should output the minimum number of transformation needed as Sample output in one line. If it's impossible ,then print 'No path!' without the quotes.

Sample Input

5 7
3 4

Sample Output

Need 1 step(s)

No path!

bfs注意不要重复放一个数,不然队列就爆了,然后可以将素数先打表,我这里还将每个数的前一个最大素数打表了,用的时候有种链表的快感

下面是AC代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int preprime[1005], prime[1005] = { 0 };
void bfs(int S,int T,int step[], int vis[])
{
	int temp1, ts;
	queue<int>p;
	step[S] = 1;
	p.push(S);
	while (!p.empty())
	{
		temp1 = p.front();
		ts=temp1;
		p.pop();
		while (preprime[ts] != 0)
		{
			if (temp1 + preprime[ts]<T)
			{
				if (vis[temp1 + preprime[ts]] == 0)
				{
					p.push(temp1 + preprime[ts]);
				  step[temp1 + preprime[ts]] = step[temp1] + 1;
					vis[temp1 + preprime[ts]]=1;
				}
			}
			else if (temp1 + preprime[ts] == T)
			{
				cout << "Need " << step[temp1] << " step(s)" << endl;
				return;
			}
			ts = preprime[ts];
		}
	}
	cout << "No path!" << endl;
}
int main()
{
	int S, T;
	int step[1005] = {0};
	int vis[1005] = {0};
	int temp = 0;
	for (int i = 2; i<502; i++)
		for (int j = 2 * i; j<1002; j += i)
			prime[j] = 1;
	for (int i = 2; i<1002; i++)
	{
		preprime[i] = temp;
		if (prime[i] == 0)
			temp = i;
	}
	while (scanf("%d%d",&S,&T)==2)
	{
		if(S==1||S==2)
		cout << "No path!" << endl;
		else
		{
			for(int i=0;i<T;i++)
			{
				vis[i]=0;
				step[i]=0;
			}
		  bfs(S,T,step, vis);
		}
	}
	return 0;
}


内容概要:本文介绍了一项创新性未发表的研究,即利用多元宇宙优化算法(Multiverse Optimizer, MVO)对分时电价下的需求响应与综合能源系统调度问题进行建模与求解,旨在实现能源系统的经济性、高效性与可持续性运行。该研究构建了包含多种能源设备(如光伏、风机、燃气轮机、储能系统等)及可调节负荷的综合能源系统模型,充分考虑了用户侧的需求响应行为在分时电价机制下的响应特性,通过MVO算法对系统运行成本、能源利用率、碳排放等多目标进行协同优化,实现了日前调度计划的智能决策。研究还提供了完整的MATLAB代码实现,便于研究人员复现实验、验证算法性能,并为进一步研究提供可靠的仿真基础。; 适合人群:具备一定电力系统、优化算法及MATLAB编程基础的科研人员、研究生以及从事能源互联网、综合能源系统规划与运行的技术工程师。; 使用场景及目标:① 学习并掌握多元宇宙优化算法在复杂能源系统调度中的具体应用方法;② 研究分时电价机制如何通过需求响应引导用户参与电网互动,实现削峰填谷;③ 实现综合能源系统(IES)中冷、热、电、气等多种能源的协同优化调度,以降低运行成本、提高新能源消纳能力和系统可靠性;④ 为相关领域的学术研究提供可复现的代码实例和仿真平台。; 阅读建议:此资源以MATLAB代码为核心载体,深入剖析了算法应用与系统建模的全过程。建议读者在学习时,不仅应关注代码的实现细节,更要理解其背后的数学模型、优化目标设定和约束条件的物理意义。建议结合文档中的模型描述,逐步调试代码,观察不同参数和场景下的优化结果,从而深刻掌握综合能源系统优化调度的设计思想与关键技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值