BFS超级水题= =
但是其实要不是看到它分类在BFS里面我都想爆搜了= =
然后就没有然后了
就是每一位上的数不断的变化,判断是否为质数,并且此数是否已经被访问过
很基本的BFS
没什么难的,就是注意要剪枝,别TLE了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
int m,n;
bool vis[10001];
struct node
{
int prime;
int step;
}now,next;
bool JudgePrime(int digit)
{
if(digit==2 || digit==3)
return true;
else if(digit<=1 || digit%2==0)
return false;
else if(digit>3)
{
for(int i=3;i*i<=digit;i+=2)
if(digit%i==0)
return false;
return true;
}
}
void bfs()
{
queue<node> q;
now.prime=m;
now.step=0;
q.push(now);
vis[m]=true;
while(!q.empty())
{
now=q.front();
if(now.prime==n)
{
cout<<now.step<<endl;
return ;
}
int x=now.prime%10;
int y=(now.prime/10)%10;
q.pop();
for(int i=0;i<=9;i++)//gewei
{
next.prime=(now.prime/10)*10+i;
if(next.prime!=now.prime&&JudgePrime(next.prime)&&!vis[next.prime])
{
vis[next.prime]=true;
next.step=now.step+1;
q.push(next);
}
}
for(int i=0;i<=9;i++)
{
next.prime=(now.prime/100)*100+i*10+x;
if(next.prime!=now.prime&&JudgePrime(next.prime)&&!vis[next.prime])
{
vis[next.prime]=true;
next.step=now.step+1;
q.push(next);
}
}
for(int i=0;i<=9;i++)
{
next.prime=(now.prime/1000)*1000+i*100+y*10+x;
if(next.prime!=now.prime&&JudgePrime(next.prime)&&!vis[next.prime])
{
vis[next.prime]=true;
next.step=now.step+1;
q.push(next);
}
}
for(int i=1;i<=9;i++)
{
next.prime=now.prime%1000+i*1000;
if(next.prime!=now.prime&&JudgePrime(next.prime)&&!vis[next.prime])
{
vis[next.prime]=true;
next.step=now.step+1;
q.push(next);
}
}
}
cout<<"Impossible"<<endl;
return;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof vis);
scanf("%d%d",&m,&n);
bfs();
}
return 0;
}