• POJ 3126 Prime Path bfs 简单


    给出2个四位数的素数a,b,要求a每次变化只可以变a的4个数字的其中一个,并且变化后的数也要是素数,问a至少要变化多少次才可以变为b。

    注意,a的千位数不能变化为0

    先打出素数表,再bfs数a即可。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 
     5 using namespace std;
     6 
     7 const int maxn=10010;
     8 const int inf=0x3f3f3f3f;
     9 
    10 bool prime[maxn];
    11 bool vis[maxn];
    12 
    13 void init_prime()
    14 {
    15     memset(prime,true,sizeof prime);
    16     prime[1]=false;
    17     for(int i=2;i<maxn;i++)
    18     {
    19         if(prime[i])
    20         {
    21             for(int j=i*2;j<maxn;j+=i)
    22                 prime[j]=false;
    23         }
    24     }
    25     return ;
    26 }
    27 struct Node
    28 {
    29     int num,cnt;
    30 };
    31 
    32 inline int pow(int x,int y)
    33 {
    34     int ret=1;
    35     for(int i=1;i<=y;i++)
    36         ret*=x;
    37     return ret;
    38 }
    39 
    40 int bfs(int a,int b)
    41 {
    42     if(a==b)
    43         return 0;
    44     memset(vis,false,sizeof vis);
    45     Node str;
    46     str.num=a;
    47     str.cnt=0;
    48     queue<Node>que;
    49     while(!que.empty())
    50         que.pop();
    51     que.push(str);
    52     vis[str.num]=true;
    53     while(!que.empty())
    54     {
    55         Node u=que.front();
    56         que.pop();
    57         if(u.num==b)
    58             return u.cnt;
    59         for(int i=1;i<=4;i++)
    60         {
    61             for(int j=0;j<10;j++)
    62             {
    63                 //第i位改为j
    64                 if(i==4&&j==0)
    65                     continue;
    66                 int x=(u.num%pow(10,i))/pow(10,i-1);
    67                 if(x==j)
    68                     continue;
    69                 Node tmp;
    70                 tmp.num=u.num-x*pow(10,i-1)+j*pow(10,i-1);
    71                 if(!prime[tmp.num])
    72                     continue;
    73                 if(vis[tmp.num])
    74                     continue;
    75                 tmp.cnt=u.cnt+1;
    76                 que.push(tmp);
    77                 vis[tmp.num]=true;
    78             }
    79         }
    80     }
    81 }
    82 
    83 int main()
    84 {
    85     init_prime();
    86     int test;
    87     scanf("%d",&test);
    88     while(test--)
    89     {
    90         int a,b;
    91         scanf("%d%d",&a,&b);
    92 
    93         printf("%d
    ",bfs(a,b));
    94     }
    95     return 0;
    96 }
    View Code
  • 相关阅读:
    写了一个分页控件。
    职业规划
    程序员该做的事
    做就做最优秀的员工
    Tomcat+JSP经典配置实例
    2005年11月26日8点50左右,南昌地震。
    如何添加一个自定义的columnstyles 到设计器中,以便在设计时直接使用他们?
    Oracle 的入门心得【强烈推荐】
    如何随机显示记录条数的15% ?
    重写DataGrid的DataGridBoolColumn,添加bool值改变事件。
  • 原文地址:https://www.cnblogs.com/-maybe/p/4694709.html
Copyright © 2020-2023  润新知