http://poj.org/problem?id=3126
题目大意:就是说给你两个素数,让你每次可以改变第一个素数的某一位数,而且这个新的数也必须是素数,问经过多少次这样的变形,可以得到开始给出的第二个素数。
思路:
一开始以为是数论的题目,后来才发现是搜索,对素数打表,然后每次都搜索素数表就行
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
using namespace std;
int st[10005],v[10005];
int cnt[10005];
int t[5];
void prim()
{
int i,j;
st[0]=1;
st[1]=1;
for (i=2;i<10000;i++)
{
if(st[i]==0)
for (j=i*2;j<10000;j+=i)
{
st[j]=1;
}
}
}
int bfs(int now,int last)
{
int i,j,tmp,xx;
int cur,next;
memset(cnt,0,sizeof(cnt));
queue<int>q;
q.push(now);
while(!q.empty())
{
cur=q.front();
q.pop();
//printf("%d %d\n",cur.num,last);
if(cur==last)
return cnt[cur];
t[0]=cur/1000;
t[1]=cur/100%10;
t[2]=cur/10%10;
t[3]=cur%10;
//printf("%d %d %d %d %d\n",cur,t[0],t[1],t[2],t[3]);
for(i=0;i<4;i++)
{
tmp=t[i];
for(j=0;j<10;j++)
{
if(tmp!=j)
{
t[i]=j;
xx=t[0]*1000+t[1]*100+t[2]*10+t[3];
if(!v[xx]&&st[xx]==0)
{
v[xx]=1;
cnt[xx]=cnt[cur]+1;
// printf("%d %d\n",xx,next.step);
q.push(xx);
}
if(xx==last)
return cnt[xx];
}
t[i]=tmp;
}
}
}
return -1;
}
int main()
{
int i,j,x,y,n;
memset(st,0,sizeof(st));
prim();
for(i=0;i<1000;i++)
st[i]=1;
scanf("%d",&n);
while(n--)
{
memset(v,0,sizeof(v));
scanf("%d%d",&x,&y);
v[x]=1;
int ans=bfs(x,y);
if(ans!=-1)
printf("%d\n",ans);
else
{
printf("Impossible\n");
}
}
}