这个题目可以比较容易的设计一个启发式函数,而且该函数的效果也比较好
不过一般的启发式搜索用的是bfs,然后要用到优先队列,还得判重
虽然不困难,但也麻烦
尝试了下用迭代加深的方式来做启发式搜索
方法是下界已经超过的点吧不予扩展,效果不错
缺点是产生了重复的点比较多,而且也牺牲了时间在重复搜索上
优点:实现简单,节省空间
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=10001;
int prime[maxn];
int primeini()
{
memset(prime,0,sizeof(prime));
for(int i=2;i<=maxn;i++)
if(!prime[i])
for(int j=i+i;j<=maxn;j+=i)
prime[j]=1;
}
int min(int a,int b)
{
int time=0;
int t[5],s[5];
for(int i=1;i<=4;i++)
{
t[i]=a;a/=10;
s[i]=b;b/=10;
if(t[i]!=s[i]) time++;
}
return(time);
}
int dfs(int a,int b,int time,int limit)
{
// printf("%d %d\n",a,b);
if(a==b) return(1);
int tmp=a/10*10;
for(int i=0;i<=9;i++)
if(!prime[tmp+i]&&time+1+min(tmp+i,b)<=limit)
if(dfs(tmp+i,b,time+1,limit)) return 1;
tmp=a/100*100+a;
for(int i=0;i<=9;i++)
if(!prime[tmp+i*10]&&time+1+min(tmp+i*10,b)<=limit)
if(dfs(tmp+i*10,b,time+1,limit)) return 1;
tmp=a/1000*1000+a0;
for(int i=0;i<=9;i++)
if(!prime[tmp+i*100]&&time+1+min(tmp+i*100,b)<=limit)
if(dfs(tmp+i*100,b,time+1,limit)) return 1;
tmp=a00;
for(int i=1;i<=9;i++)
if(!prime[tmp+i*1000]&&time+1+min(tmp+i*1000,b)<=limit)
if(dfs(tmp+i*1000,b,time+1,limit)) return(1);
return(0);
}
int main()
{
primeini();
int tcase; scanf("%d",&tcase);
while(tcase--)
{
int a,b;
scanf("%d %d",&a,&b);
int limit=0;
// dfs(a,b,0,3);
while(!dfs(a,b,0,limit)) limit++;
printf("%d\n",limit);
}
return 0;
}