LightOJ - 1141 Number Transformation

In this problem, you are given an integer number s. You can transform any integer number A to another integer number B by adding x to A. This x is an integer number which is a prime factor of A (please note that 1 and A are not being considered as a factor of A). Now, your task is to find the minimum number of transformations required to transform sto another integer number t.

Input

Input starts with an integer T (≤ 500), denoting the number of test cases.

Each case contains two integers: s (1 ≤ s ≤ 100) and t (1 ≤ t ≤ 1000).

Output

For each case, print the case number and the minimum number of transformations needed. If it's impossible, then print -1.

Sample Input

2

6 12

6 13

Sample Output

Case 1: 2

Case 2: -1

题目大意:给两个数s,t,然后s加上他的一个质因子形成另一个数,在让这个新的数加上他的质因子形成另一个数,输出最少的这个过程是s==t,得不到就输出-1

解题思路:bfs求解

AC代码:

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
bool vis[1100];
int prime[1100];
int s,t;
struct node{
	int x;
	int step;
}; 
void get_prime()//素数打表 
{
	for(int i=2;i*i<=1100;i++)
	{
		if(!prime[i])
		{
			for(int j=i*i;j<=1100;j+=i)
				prime[j]=1;
		}
	}
}
int bfs()
{
	memset(vis,0,sizeof(vis));
	queue<node>q;
	node now,nextt;
	now.x=s;
	now.step=0;
	q.push(now);
	while(!q.empty())
	{
		now=q.front();
		q.pop();
		if(now.x==t)
			return now.step;
		for(int i=2;i<now.x;i++)
		{
			if(now.x%i==0&&!prime[i]&&now.x+i<=t&&!vis[now.x+i])
			{
				nextt.x=now.x+i;
				nextt.step=now.step+1;
				vis[nextt.x]=1;
				q.push(nextt);
			}
		}
	}
	return -1;
}
int main()
{
	int T,k=1;
	get_prime(); 
	cin>>T;
	while(T--)
	{
		cin>>s>>t;
		printf("Case %d: %d\n",k++,bfs());
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40707370/article/details/84962613