poj prime path 启发式搜索

这个题目可以比较容易的设计一个启发式函数,而且该函数的效果也比较好

不过一般的启发式搜索用的是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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值