POJ3126 BFS
这题。。。。一次就A了。有点太水了。其中本来还觉得就判断质数比较耗时。
其实只要先制成一张质数的表。每次去查就行了。耗时就小了。
#include<iostream>
#include<math.h>#include<queue>
using namespace std;
int data,target;
bool prime[10005];
int visit[10005];
bool isprime(int t)
{
for(int i=2;i<=sqrt(double(t));i++)
if(t%i==0)
return false;
return true;
}
void makejudge()
{
for(int i=1000;i<=9999;i++)
prime[i]=isprime(i);
}
void bfs()
{
queue<int> que;
que.push(data);
visit[data]=1;
while(!que.empty())
{
int now=que.front();
que.pop();
if(now==target)
{
printf("%d\n",visit[now]-1);
return;
}
for(int i1=1;i1<=9;i1++)
{
int t1=((now/1000+i1)%10)*1000+now%1000;
if(t1/1000==0)
continue;
if(prime[t1]&&!visit[t1])
{
que.push(t1);
visit[t1]=visit[now]+1;
//break;
}
}
for(int i2=1;i2<=9;i2++)
{
int t2=((((now/100)%10)+i2)%10)*100+(now/1000)*1000+now%100;
if(prime[t2]&&!visit[t2])
{
que.push(t2);
visit[t2]=visit[now]+1;
//break;
}
}
for(int i3=1;i3<=9;i3++)
{
int t3=((((now/10)%10)+i3)%10)*10+(now/1000)*1000+((now/100)%10)*100+now%10;
if(prime[t3]&&!visit[t3])
{
que.push(t3);
visit[t3]=visit[now]+1;
//break;
}
}
for(int i4=1;i4<=9;i4++)
{
int t4=((now%10)+i4)%10+now-(now%10);
if(prime[t4]&&!visit[t4])
{
que.push(t4);
visit[t4]=visit[now]+1;
//break;
}
}
}
printf("Impossible\n");
}
int main()
{
//freopen("C:\\Users\\wuyanyisb\\Desktop\\1.txt","r",stdin);
int cases;
scanf("%d\n",&cases);
makejudge();
while(cases--)
{
scanf("%d %d\n",&data,&target);
memset(visit,0,sizeof(visit));
bfs();
}
system("pause");
return 0;
}
浙公网安备 33010602011771号