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!
这道题先得到1000以内的素数,然后bfs,通过这道题,才开始理解bfs的用法,唉,路还很远啊
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define N 1001
int prime[N],cnt;
int step[N];
bool b[N];
int s,t;
void filter()
{
int i,j;
for(i=2;i<N;i++)
{
if(b[i])
{
prime[cnt++]=i;
for(j=i<<1;j<N;j+=i) b[j]=false;
}
}
}
void init()
{
memset(b,true,sizeof(b));
cnt=0;
}
void bfs()
{
queue<int> q;
bool success=false;
int ans,cur,next;
memset(step,-1,sizeof(step));
q.push(s);
step[s]=0;
while(!q.empty() && !success)
{
cur=q.front();
q.pop();
if(cur==t)
{
success=true;
ans=step[cur];
}
for(int i=0;prime[i]<cur && !success;i++)
{
next=cur+prime[i];
if(next>t) continue;
if(step[next]==-1)
{
step[next]=step[cur]+1;
if(next==t)
{
success=true;
ans=step[next];
}
else q.push(next);
}
}
}
if(success) printf("Need %d step(s)\n",ans);
else puts("No path!");
}
int main()
{
init();
filter();
while(~scanf("%d%d",&s,&t)) bfs();
return 0;
}
这是高手的代码,细细品味后,果然博大精深,值得好好研究。。。