题目链接
题目大意
一个四位数的素数,每次变化一个数字,得到一个新的素数,问最少经历多少次这样的变化,才能得到目标素数。(例子如下)
思路
bfs,每一个数字都尝试一次,
代码
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
bool prime[10005];
int bfs(int first,int last)
{
int num[4];
bool record[10005];
int countnum[10005];
memset(record,false,sizeof(record)); //清零
memset(countnum,0,sizeof(countnum));
record[first]=true;
queue<int> q;
q.push(first);
while(!q.empty())
{
int t=q.front();
q.pop();
num[0]=t/1000;
num[1]=t%1000/100;
num[2]=t%100/10;
num[3]=t%10;
for(int i=0; i<4; i++)
{
int ex=num[i];
for(int j=0; j<=9; j++)
{
if(num[i]==j)
continue;
num[i]=j;
int newnum=num[0]*1000+num[1]*100+num[2]*10+num[3];
if(prime[newnum]==true && record[newnum]==false)
{
countnum[newnum]=countnum[t]+1;
record[newnum]=true;
q.push(newnum);
}
if(newnum == last)
return countnum[newnum];
}
num[i]=ex;
}
if(t==last)
return countnum[t];
}
return -1;
}
int main()
{
int N;
for(int i=1000; i<10000; i++)
{
int j;
int f=0;
for(j=2; j*j<=i; j++)
{
if(i%j==0)
{
prime[i]=false;
f=1;
break;
}
}
if(f==0)
prime[i]=true;
}
cin>>N;
while(N--)
{
int first,last;
cin>>first>>last;
int ans=bfs(first,last);
if(ans != -1)
cout<<ans<<endl;
else
cout<<"Impossible"<<endl;
}
return 0;
}
注意事项
① 初始化prime数组的时候,要调用函数啊啊啊,我说怎么一开始都是0,原来是没有调用函数。。
② 数组record是记录是否遍历过的,防止循环多次重复遍历;数组countnum是记录次数的,找出上一个数字的次数,然后加1
③ 每次都要初始化为0,memset在头文件<string.h>里