问题描述:
给定两个素数a b,求a变幻到b需要几步
并且变幻时只有一个数字不同,并且是素数
思路:我开始怎么都没想到用bfs 我只记得做过这个,看了别人的思路才想起来,一天不做,费3天.。把所有的素数打表,然后bfs深搜
#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <string.h>
#include <map>
#include <queue>
using namespace std;
bool prime[10001];
void init()
{
int i,j;
for(i=1000;i<=10000;i++){
for(j=2;j<i;j++)
if(i%j==0){
prime[i]=false;
break;
}
if(j==i) prime[i]=true;
}
}
int bfs(int a,int b)
{
bool vis[10001];
queue <int>q;
int v,i,j,temp,vtemp,count[10001],t[4];
memset(vis,0,sizeof(vis));
memset(count,0,sizeof(count));
q.push(a);
while(!q.empty())
{
v=q.front();
if(v==b) return count[v];
q.pop();
vis[v]=1;
t[0]=v%10;
t[1]=v/10%10;
t[2]=v/100%10;
t[3]=v/1000;
for(j=0; j<4; j++)
{
temp=t[j];
for(i=0; i<=9; i++)
{
t[j]=i;
vtemp=t[3]*1000+t[2]*100+t[1]*10+t[0];
if(i!=temp)
{
if(prime[vtemp]&&vis[vtemp]==0)
{
count[vtemp]=count[v]+1;
vis[vtemp]=true;
q.push(vtemp);
}
}
if(vtemp==b) return count[vtemp];
}
t[j]=temp;
}
}
return -1;
}
int main()
{
int t;
init();
scanf("%d",&t);
while(t--)
{
int a,b;
scanf("%d%d",&a,&b);
int ans=bfs(a,b);
if(ans==-1)printf("Impossible\n");
else printf("%d\n",ans);
}
return 0;
}