zoukankan      html  css  js  c++  java
  • POJ3126 Prime Path

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

    题目大意:给两个数四位数m, n, m的位数各个位改变一位0 —— 9使得改变后的数为素数,
    问经过多少次变化使其等于n
    如:
    1033
    1733
    3733
    3739
    3779
    8779
    8179
    分析:用字符串存m,n,这样改变各个位较方便

     数组开大一点,开始数组开小了,结果就出错了

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<queue>
    #include<string.h>
    #define max(a, b)(a > b ? a : b)
    #define min(a, b)(a < b ? a : b)
    #define INF 0xffffff
    #define N 10010
    
    using namespace std;
    
    struct node
    {
        char s[5];
        int step;
    };
    
    char s1[5], s2[5], s3[5];
    bool vis[N];
    
    int prime(int n)
    {
        int i, k = (int)sqrt(n);
        for(i = 2 ; i <= k ; i++)
            if(n % i == 0)
                return 0;
        return 1;
    }
    
    int BFS(char s[])
    {
        queue<node>Q;
        node now, next;
        int i, j, h, x = 0;
        memset(vis, false, sizeof(vis));
        memset(s3, 0, sizeof(s3));
        for(i = 0 ; i < 4 ; i++)
            x = x * 10 + (s[i] - '0');
        vis[x] = true;
        strcpy(now.s, s);
        now.step = 0;
        Q.push(now);
        while(!Q.empty())
        {
            now = Q.front();
            Q.pop();
            if(strcmp(now.s, s2) == 0)
                return now.step;
            for(i = 0 ; i < 4 ; i++)
            {
                for(j = 0 ; j < 10 ; j++)
                {
                    if((i == 0 && j == 0) || now.s[i] == j + '0')
                        continue;
                    strcpy(s3, now.s);
                    now.s[i] = j + '0';
                    x = 0;
                    for(h = 0 ; h < 4 ; h++)
                        x = x * 10 + (now.s[h] - '0');
                    if(!vis[x] && prime(x) == 1)
                    {
                        vis[x] = true;
                        next.step = now.step + 1;
                        strcpy(next.s, now.s);
                       // i = 0;
                       // j = 0;
                        Q.push(next);
                    }
                    strcpy(now.s, s3);
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        int t;
        scanf("%d", &t);
        while(t--)
        {
            scanf("%s%s", s1, s2);
            printf("%d
    ", BFS(s1));
        }
        return 0;
    }
  • 相关阅读:
    笨办法42物以类聚(补充40)
    笨办法41来自 Percal 25 号行星的哥顿人-randint-exit(0)
    nginx模块1--索引autoindex_基于ip_监控模块status
    selinux
    nginx安装与配置--基础
    svn安装
    docker-registry私有registry
    zabbix钉钉报警
    zabbix字体
    zabbix告警
  • 原文地址:https://www.cnblogs.com/qq2424260747/p/4662595.html
Copyright © 2011-2022 走看看