zoukankan      html  css  js  c++  java
  • POJ-3126 Prime Path---BFS+素数打表

    题目链接:

    https://vjudge.net/problem/POJ-3126

    题目大意:

    给两个四位数a,b 每次改变a中的一位而且改动之后的必须是素数,问最少改动几次可以到b?(永远达不到b就输出impossible)

    思路:

    素数打表更好直接判断,然后BFS,用力一点小技巧可以直接生成所有可到达的点

     1 #include<iostream>
     2 #include<vector>
     3 #include<queue>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cstdio>
     7 #include<set>
     8 #include<map>
     9 #include<cmath>
    10 using namespace std;
    11 typedef pair<int, int> Pair;
    12 typedef long long ll;
    13 const int INF = 0x3f3f3f3f;
    14 int T, n, m;
    15 const int maxn = 10000 + 10;
    16 bool is_prime[maxn];
    17 void init()
    18 {
    19     for(int i = 2; i < maxn; i++)is_prime[i] = 1;
    20     for(int i = 2; i * i < maxn; i++)
    21     {
    22         if(is_prime[i])
    23         {
    24             for(int j = i * i; j < maxn; j += i)is_prime[j] = 0;
    25         }
    26     }
    27     //for(int i = 0; i < maxn; i++)if(is_prime[i])cout<<i<<endl;
    28 }
    29 bool v[maxn];
    30 void bfs()
    31 {
    32     int a[4], b[4];
    33     b[0] = 1000, b[1] = 100, b[2] = 10, b[3] = 1;
    34     queue<Pair>q;
    35     memset(v, 0, sizeof(v));
    36     q.push(Pair(n, 0));
    37     v[n] = 1;
    38 
    39     while(!q.empty())
    40     {
    41         Pair now = q.front();
    42         q.pop();
    43         int x = now.first;
    44         if(x == m)
    45         {
    46             cout<<now.second<<endl;
    47             return;
    48         }
    49         a[0] = x % 1000;//每一位置为0
    50         a[1] = x - x / 100 % 10 * 100;
    51         a[2] = x - x / 10 % 10 * 10;
    52         a[3] = x - x % 10;
    53         for(int i = 0; i < 4; i++)//生成所有的可变化的四位数
    54         {
    55             for(int j = 0; j < 10; j++)
    56             {
    57                 int y = a[i] + j * b[i];
    58                 if(y < 1000 || y == x || !is_prime[y] || v[y])continue;
    59                 v[y] = 1;
    60                 q.push(Pair(y, now.second + 1));
    61             }
    62         }
    63     }
    64     cout<<"Impossible"<<endl;
    65     return;
    66 }
    67 int main()
    68 {
    69     init();
    70     cin >> T;
    71     while(T--)
    72     {
    73         cin >> n >> m;
    74         bfs();
    75     }
    76 }
  • 相关阅读:
    SQLite剖析之功能特性
    SQLite剖析之内核研究
    SQLite剖析之体系结构
    SQLite安装、编译与应用
    实验四 数据库查询--2
    Linux监控一之Nagios的安装与配置
    keepalived原理(主从配置+haproxy)及配置文件详解
    负载均衡之Haproxy配置详解(及httpd配置)
    使用HeartBeat实现高可用HA的配置过程详解
    在Linux安装配置Tomcat 并部署web应用 ( 三种方式 )
  • 原文地址:https://www.cnblogs.com/fzl194/p/8811244.html
Copyright © 2011-2022 走看看