zoukankan      html  css  js  c++  java
  • poj 3126 Prime Path (bfs)

    题目:http://poj.org/problem?id=3126

    题意:给你两个四位数,a和b,然后改变四位中的一位,从a改变到b,每次得到的数必须是素数,求最小改变次数

    注意:初始化问题,就是队列一开始一定要是空的。。。(wa了好几次)

    代码:

    View Code
      1 #include <iostream>
      2 #include<queue>
      3 #include<cmath>
      4 #include<cstring>
      5 using namespace std;
      6 queue<int>q;
      7 int num[10010],m,n;
      8 int vis[10010];
      9 int head,tail;
     10 int flag;
     11 int pan(int a)
     12 {
     13     int i;
     14     int k=sqrt(double(a));
     15     for(i=2;i<=k;i++)
     16     {
     17         if(a%i==0)
     18         return 0;
     19     }
     20     return 1;
     21 }
     22 void bfs(int a)
     23 {
     24     int s;
     25     int i;
     26     for(i=1;i<=9;i++)
     27     {
     28         s=i*1000+a%1000;
     29         if(s==n)
     30         {
     31             cout<<num[a]+1<<endl;
     32             flag=1;
     33             return ;
     34         }
     35         if(pan(s)&&vis[s]==0)
     36         {
     37             q.push(s);
     38             num[s]=num[a]+1;
     39             vis[s]=1;
     40         }
     41     }
     42     for(i=0;i<=9;i++)
     43     {
     44         s=(a/1000)*1000+i*100+a%100;
     45         if(s==n)
     46         {
     47             cout<<num[a]+1<<endl;
     48             flag=1;
     49             return ;
     50         }
     51         if(pan(s)&&vis[s]==0)
     52         {
     53             q.push(s);
     54             num[s]=num[a]+1;
     55             vis[s]=1;
     56         }
     57     }
     58     for(i=0;i<=9;i++)
     59     {
     60 
     61         s=(a/100)*100+i*10+a%10;
     62         if(s==n)
     63         {
     64             cout<<num[a]+1<<endl;
     65             flag=1;
     66             return ;
     67         }
     68         if(pan(s)&&vis[s]==0)
     69         {
     70             q.push(s);
     71             num[s]=num[a]+1;
     72             vis[s]=1;
     73         }
     74     }
     75     for(i=1;i<=9;i+=2)
     76     {
     77         s=(a/10)*10+i;
     78         if(s==n)
     79         {
     80             cout<<num[a]+1<<endl;
     81             flag=1;
     82             return ;
     83         }
     84         if(pan(s)&&vis[s]==0)
     85         {
     86             q.push(s);
     87             num[s]=num[a]+1;
     88             vis[s]=1;
     89         }
     90     }
     91     return ;
     92 }
     93 int main()
     94 {
     95 
     96     int t;
     97     cin>>t;
     98     while(t--)
     99     {
    100         while(!q.empty())
    101         {
    102             q.pop();
    103         }
    104         cin>>m>>n;
    105         int s;
    106         if(m==n)
    107         {
    108             flag=1;
    109             cout<<"0"<<endl;
    110         }
    111         else
    112         {
    113             memset(vis,0,sizeof(vis));
    114             q.push(m);
    115             vis[m]=1;
    116             num[m]=0;
    117             flag=0;
    118             while(!q.empty())
    119             {
    120                 s=q.front();
    121                 bfs(s);
    122                 if(flag)
    123                 {
    124                     break;
    125                 }
    126                 q.pop();
    127             }
    128         }
    129         if(!flag)
    130         {
    131             cout<<"Impossible"<<endl;
    132         }
    133     }
    134     return 0;
    135 }
  • 相关阅读:
    文艺平衡树
    [BJOI2010] 严格次小生成树
    BZOJ3864 hero meet devil
    [NOI2010]能量采集(莫比乌斯反演)
    陌上花开(三维偏序)(cdq分治)
    树状数组套trie 模板
    SDOI2010粟粟的书架
    OI计算几何 简单学习笔记
    OI知识点|NOIP考点|省选考点|教程与学习笔记合集
    悬线法学习笔记
  • 原文地址:https://www.cnblogs.com/wanglin2011/p/2879023.html
Copyright © 2011-2022 走看看