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

    给两个素数,求第一个素数转变成第二个素数所需最小步骤数。每次转换只能改变一位,且转换的中间数都为素数。

    最短路径问题,打出一个素数表,对4位数的各个位置0..9暴搜。

    比较郁闷的是sqrt()和pow()中必须要用强制转换才行,不记得以前要这样用啊??CE了几次。

    code:

    #include<cstdio>
    #include<cmath>
    #include<cstring>
    using namespace std ;
    bool prim[10000] ;
    bool vis[10000] ;
    int q[1000] ;
    void getPrim(){
        for(int i=1000; i<10000; i++){
            prim[i] = true ;
            for(int j=2; j<=sqrt((double)i); j++){//这里必须要强制为double
                if(i%j==0){
                    prim[i] = false ;
                    break ;
                }
            }
        }
    }
    int reset(int x, int i){
        int temp[4], y = 0 ;
        for(int j=0; j<4; j++){
            temp[j] = x % 10 ;
            x = x / 10 ;
        }
        temp[i] = 0 ;
        for(int j=0; j<4; j++)
            y += temp[j] * pow((double)10, j) ;
        return y ;
    }
    int main(){
        int t, n, m, flag, h, r, head, temp, ans ;
        scanf("%d", &t) ;
        getPrim() ;
        while(t--){
            scanf("%d%d", &n, &m) ;
            if(n==m){
                printf("0\n") ;
                continue ;
            }
            memset(vis, falsesizeof(vis)) ;
            flag = 0, ans = 0 ;
            q[0] = n, h = 0, r = 1 ;
            while(r>h&&!flag){
                int k = r - h ;
                ans ++ ;
                while(k--){
                    head = q[h++] ;
                    for(int i=0; i<4; i++){
                        temp = reset(head, i) ;
                        for(int j=0; j<=9; j++){
                            int tem = temp + j * pow((double)10, i) ;
                            if(tem==m){
                                flag = 1 ;
                                break ;
                            }
                            if(!vis[tem]&&prim[tem]){
                                q[r++] = tem ;
                                vis[tem] = true ;
                            }
                        }
                    }
                }
            }
            printf("%d\n", ans) ;
        }
        return 0 ;

    }

  • 相关阅读:
    这篇通俗实用的Vlookup函数教程,5分钟就可以包你一学就会
    nginx 常见正则匹配符号表示
    Nginx if 条件判断
    nginx 将请求全部指向到一个页面
    windows10下面部署nginx(解决文件名中文乱码问题)
    二.Nginx反向代理和静态资源服务配置
    Nginx的使用(一)代理静态文件
    使用Nginx反向代理和内容替换模块实现网页内容动态替换功能
    如何让NGINX显示文件夹目录
    Nginx 如何设置反向代理 多服务器,配置区分开来,单独文件保存单个服务器 server 主机名配置,通过 include 实现
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2353502.html
Copyright © 2011-2022 走看看