zoukankan      html  css  js  c++  java
  • POJ 3126 Prime Path 素数筛,bfs

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

    困得不行了,没想到敲完一遍直接就A了,16ms,debug环节都没进行。人品啊。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <queue>
     4 using namespace std;
     5 
     6 bool prime[10000];
     7 int vis[10000];
     8 int s, t;
     9 
    10 void prime_init()
    11 {
    12     memset(prime, 1, sizeof(prime));
    13     prime[1] = 0;
    14     for(int i = 4; i < 10000; i += 2)
    15         prime[i] = 0;
    16     for(int i = 3; i < 100; i += 2)
    17     {
    18         if(prime[i])
    19         {
    20             for(int j = i*i; j < 10000; j += i+i)
    21                 prime[j] = 0;
    22         }
    23     }
    24 }
    25 
    26 queue<int>q;
    27 void bfs()
    28 {
    29     while(!q.empty())q.pop();
    30     memset(vis, 0, sizeof(vis));
    31     q.push(s);
    32     vis[s] = 1;
    33     while(!q.empty())
    34     {
    35         int u = q.front();
    36         q.pop();
    37         if(u == t)
    38         {
    39             printf("%d
    ", vis[u]-1);
    40             return;
    41         }
    42         int a = u % 10;
    43         int b = u % 100 - a;
    44         int c = u % 1000 - a - b;
    45         int d = u - u % 1000;
    46         for(int i = u-a; i <= u-a+9; i++)
    47         {
    48             if(prime[i] && !vis[i])
    49             {
    50                 q.push(i);
    51                 vis[i] = vis[u] + 1;
    52             }
    53         }
    54         for(int i = u-b; i <= u-b+90; i += 10)
    55         {
    56             if(prime[i] && !vis[i])
    57             {
    58                 q.push(i);
    59                 vis[i] = vis[u] + 1;
    60             }
    61         }
    62         for(int i = u-c; i <= u-c+900; i += 100)
    63         {
    64             if(prime[i] && !vis[i])
    65             {
    66                 q.push(i);
    67                 vis[i] = vis[u] + 1;
    68             }
    69         }
    70         for(int i = u-d+1000; i <= u-b+9000; i += 1000)
    71         {
    72             if(prime[i] && !vis[i])
    73             {
    74                 q.push(i);
    75                 vis[i] = vis[u] + 1;
    76             }
    77         }
    78     }
    79 }
    80 
    81 int main()
    82 {
    83     prime_init();
    84     int n;
    85     scanf("%d", &n);
    86     while(n--)
    87     {
    88         scanf("%d %d", &s, &t);
    89         bfs();
    90     }
    91     return 0;
    92 }
    View Code
  • 相关阅读:
    Android中各级目录的作用
    轻量级java开发(一)-Hibernate 安装
    Eclipse 安装插件
    Eclipse超级完美汉化教程
    JAVA中extends 与implements区别
    Java基础语法总结
    C#笔试题面试题锦集(全)总20篇
    Nginx集群
    Redis 集群方案
    MS Sql Server 中主从库的配置和使用介绍
  • 原文地址:https://www.cnblogs.com/wolfred7464/p/3267872.html
Copyright © 2011-2022 走看看