Prime Path (广搜(水))

来源:互联网 发布:阿里云com域名注册 编辑:程序博客网 时间:2024/06/06 04:24

题目来源:https://vjudge.net/contest/159739#problem/F
【题意】
依次给出两个四位数,均为素数,问,每次改变前一个四位数的任意位数上的数字,并且保证改的过程中出现的数字依旧是素数,能不能由前一个数推出后一个数。若可行,输出需要改多少次,若不可行,输出Impossible。
【思路】
首先想到的是深搜,并且也实现了,实现之后才发现,题目要求求得最少步数,也就是说深搜过程要每一步都要搜完,,,不超时才怪,,,然后想到广搜的话,每一步都是一样的,只要找到,那就是最少步数,所以,此题用广搜比较适合。
下面是思路:首先打出1000~10000的素数表,加以判断,然后每次广搜都所有可能的情况搜索一遍,压到队列中,加已标记(不能重复走同一条路)。
【代码】我的代码比较长,但时间我想是最短的。

#include<stack>#include<queue>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<iostream>#include<string>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;typedef long long LL;int prime[10000+10];bool vis[10000+10];struct djh{    int mid,step;} q1,q2;int st,ed;int bfs(){    queue<djh> q;    q1.mid=st;    q1.step=0;    vis[q1.mid]=1;    q.push(q1);    while(!q.empty())    {        q1=q.front();        q.pop();        for(int j=0; j<=9; j++)        {            if(j!=0)            {                if(j!=(q1.mid/1000))                {                    q2.mid=q1.mid%1000+j*1000;                    if(!prime[q2.mid]&&!vis[q2.mid])                    {                        vis[q2.mid]=1;                        if(q2.mid==ed)                            return q1.step+1;                        q2.step=q1.step+1;                        q.push(q2);                    }                }            }            if(j!=(q1.mid/100%10))            {                q2.mid=q1.mid%100+j*100+(q1.mid/1000)*1000;                if(!prime[q2.mid]&&!vis[q2.mid])                {                    vis[q2.mid]=1;                    if(q2.mid==ed)                        return q1.step+1;                    q2.step=q1.step+1;                    q.push(q2);                }            }            if(j!=(q1.mid/10%10))            {                q2.mid=q1.mid%10+j*10+(q1.mid/100)*100;                if(!prime[q2.mid]&&!vis[q2.mid])                {                    vis[q2.mid]=1;                    if(q2.mid==ed)                        return q1.step+1;                    q2.step=q1.step+1;                    q.push(q2);                }            }            if(j!=q1.mid%10)            {                q2.mid=q1.mid/10*10+j;                if(!prime[q2.mid]&&!vis[q2.mid])                {                    vis[q2.mid]=1;                    if(q2.mid==ed)                        return q1.step+1;                    q2.step=q1.step+1;                    q.push(q2);                }            }        }    }    return -1;}int main(){    for(int i=2; i<=100; i++)//素数打表        if(!prime[i])            for(int j=2*i; j<=10000; j+=i)                prime[j]=1;    int T;    scanf("%d",&T);    while(T--)    {        mem(vis,0);        scanf("%d%d",&st,&ed);        if(st==ed)        {            printf("0\n");            continue;        }        int ans=bfs();        ans==-1?printf("Impossible\n"):printf("%d\n",ans);    }}
0 0
原创粉丝点击