题目链接:
http://poj.org/problem?id=3126
这道题就是给你两个4位的素数,问你每次只能变换一个位数上的数字,问你需要几次操作把这个数变成另一个。
就是每次都变一个放入队列就好了。。
AC代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
#define maxn 10100
int vis[maxn],cnt[maxn],prim[maxn];
int star,end;
int dig[5];
void init()
{
int i,j;
memset(prim,0,sizeof(prim));
for(i=1000;i<=10000;i++)
{
for(j=2;j<i;j++)
{
if(i%j==0)
break;
}
if(i==j)
prim[i]=1;
}
}
int bfs(int st)
{
int v,temp,num;
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(st);
vis[st]=1;
while(!q.empty())
{
v=q.front();
dig[0]=v/1000;
dig[1]=v%1000/100;
dig[2]=v%100/10;
dig[3]=v%10;
//printf("%d %d %d %d\n",dig[0],dig[1],dig[2],dig[3]);
q.pop();
for(int i=0;i<4;i++)
{
temp=dig[i];
for(int j=0;j<=9;j++)
{
if(temp!=j)
{
dig[i]=j;
num=dig[0]*1000+dig[1]*100+dig[2]*10+dig[3];
if(vis[num]==0 && prim[num] ==1)
{
vis[num]=1;
q.push(num);
cnt[num]=cnt[v]+1;
}
if(num==end)
return cnt[num];
}
}
dig[i]=temp;
}
if(v==end) return cnt[v];
}
return -1;
}
int main()
{
int t,ans;
scanf("%d",&t);
init();
while(t--)
{
scanf("%d%d",&star,&end);
ans=bfs(star);
if(ans==-1) printf("Impossible\n");
else printf("%d\n",ans);
}
}