题目大意:就是给出ps,pt 2个四位数的素数,求最少由几步ps可以到达pt。其中变化的规则是:ps每次只能向任意一个四位数的素数变化,而且只能通过变动前一个素数的一位数来进行变化。
思路:BFS。用了2种做法,不过都一样思路。只不过第一种用字符串,第二种直接算而已。
AC program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
int ff[10005],prime[10005],kg;
int visited[10005];
int test;
char ps[6],pt[6];
int pp;
struct bb
{
char cc[6];
int stp;
}ans,tmp;
void bfs()
{
memset(visited,0,sizeof(visited));
queue<bb> que;
strcpy(ans.cc,ps);
ans.stp=0;
que.push(ans);
pp=atoi(ans.cc);
visited[pp]=1;
while(!que.empty())
{
ans=que.front();
que.pop();
if(strcmp(ans.cc,pt)==0)
{
cout<<ans.stp<<endl;
return;
}
for(int i=0;i<4;i++)
{
for(int g=0;g<10;g++)
{
if(i==0 && g==0) continue;//剪枝1
if(i==3 && g%2==0)continue;//剪枝2
tmp=ans;
tmp.cc[i]=g+'0';
pp=atoi(tmp.cc);
if(!visited[pp] && !ff[pp])
{
tmp.stp=ans.stp+1;
visited[pp]=1;//!!!这个没了,只是使得BFS速度变慢,我勒个去
que.push(tmp);
}
}
}
}
cout<<"Impossible"<<endl;
}
int main()
{
//freopen("f.out","w",stdout);
for(int i=2;i*i<=10005;i++)//打表
{
if(!ff[i])
{
for(int g=i*i;g<=10005;g+=i)
ff[g]=1;
}
}
cin>>test;
while(test--)
{
cin>>ps>>pt;
bfs();
}
system("pause");
return 0;}
AC program_B:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
int test,ps,pt;
int ff[10005];
int vv[10005];
struct node
{
int x;
int stp;
}ans,tmp;
void bfs()
{
queue<node>que;
memset(vv,0,sizeof(vv));
ans.stp=0;
ans.x=ps;
vv[ans.x]=1;
que.push(ans);
while(!que.empty())
{
ans=que.front();
que.pop();
if(ans.x==pt)
{
cout<<ans.stp<<endl;
return;
}
for(int i=1;i<10;i++)//千位
{
tmp.x=i*1000+ans.x%1000;
if(!vv[tmp.x] && !ff[tmp.x])
{
tmp.stp=ans.stp+1;
vv[tmp.x]=1;///!!!!!!!
que.push(tmp);
}
}
for(int i=0;i<10;i++)//百位
{
int tt=ans.x;
tmp.x=tt/1000*1000+i*100+(tt/10)%10*10+tt%10;
if(!vv[tmp.x] && !ff[tmp.x])///
{
tmp.stp=ans.stp+1;
vv[tmp.x]=1;///!!!!!!!
que.push(tmp);
}
}
for(int i=0;i<10;i++) //十位
{
int tt=ans.x;
tmp.x=tt/1000*1000+(tt/100)%10*100+i*10+tt%10;
if(!vv[tmp.x] && !ff[tmp.x])///
{
tmp.stp=ans.stp+1;
vv[tmp.x]=1;///!!!!!!!
que.push(tmp);
}
}
for(int i=1;i<10;i+=2)//各位
{
int tt=ans.x;
tmp.x=tt/10*10+i;
if(!vv[tmp.x] && !ff[tmp.x])///
{
tmp.stp=ans.stp+1;
vv[tmp.x]=1;///!!!!!!!
que.push(tmp);
}
}
}
cout<<"Impossible"<<endl;
}
int main()
{
for(int i=2;i*i<=10005;i++)
{
if(!ff[i])
{
for(int g=i*i;g<=10005;g+=i)
ff[g]=1;
}
}
cin>>test;
while(test--)
{
cin>>ps>>pt;
bfs();
}
system("pause");
return 0;}