思路:先素数打表,把1到10005范围内的素数找出来,然后把要输入的两个数当做字符串输入,然后进行广搜
广搜的思路就是,把每一位数都变化一下,存入队列中,然后不断的比较,就可以得出结果了!!!!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=10005;
string s1,s2;
int n;
int prime[maxn];
int visit[maxn];
struct node {
int step;
string s3;
};
void isprime() {//素数筛选
int i,j;
for(i=2; i<maxn; i++)prime[i]=1;
prime[0]=0,prime[1]=0;
for(i=2; i<maxn; i++) {
if(prime[i]) {
for(j=2*i; j<maxn; j+=i) {
prime[j]=0;
}
}
}
}
void bfs() {
int i,j,k,x,xx;
queue<node>q;
node cur,next;
cur.step=0;
cur.s3=s1;
x=0;
for(i=0; i<4; i++)x=x*10+cur.s3[i]-'0';
visit[x]=1;
q.push(cur);
while(!q.empty()) {
cur=q.front();
q.pop();
if(cur.s3==s2) {
printf("%d\n",cur.step);
return ;
}
for(i=0; i<4; i++) {
next=cur;
for(j=0; j<=9; j++) {
if(i==0&&j==0)continue;
if((next.s3[i]-'0')!=j)next.s3[i]=j+'0';
xx=0;
for(k=0; k<4; k++)xx=xx*10+next.s3[k]-'0';
if(prime[xx]&&!visit[xx]) {
visit[xx]=1;
next.step=cur.step+1;
q.push(next);
}
}
}
}
puts("Impossible");
}
int main() {
int num;
isprime();
while(scanf("%d",&n)!=EOF) {
while(n--) {
cin>>s1>>s2;
memset(visit,0,sizeof(visit));
bfs();
}
}
return 0;
}
HDU 1973 BFS+素数打表
最新推荐文章于 2020-08-12 03:23:15 发布