HDU - 1973 - Prime Path (BFS)

Prime Path

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 987    Accepted Submission(s): 635

Problem Description

The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. 
— It is a matter of security to change such things every now and then, to keep the enemy in the dark.
— But look, I have chosen my number 1033 for good reasons. I am the Prime minister, you know!
—I know, so therefore your new number 8179 is also a prime. You will just have to paste four new digits over the four old ones on your office door.
— No, it’s not that simple. Suppose that I change the first digit to an 8, then the number will read 8033 which is not a prime!
— I see, being the prime minister you cannot stand having a non-prime number on your door even for a few seconds.
— Correct! So I must invent a scheme for going from 1033 to 8179 by a path of prime numbers where only one digit is changed from one prime to the next prime.

Now, the minister of finance, who had been eavesdropping, intervened.
— No unnecessary expenditure, please! I happen to know that the price of a digit is one pound.
— Hmm, in that case I need a computer program to minimize the cost. You don’t know some very cheap software gurus, do you?
—In fact, I do. You see, there is this programming contest going on. . .

Help the prime minister to find the cheapest prime path between any two given four-digit primes! The first digit must be nonzero, of course. Here is a solution in the case above.
1033
1733
3733
3739
3779
8779
8179
The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.

Input

One line with a positive number: the number of test cases (at most 100). Then for each test case, one line with two numbers separated by a blank. Both numbers are four-digit primes (without leading zeros).

Output

One line for each case, either with a number stating the minimal cost or containing the word Impossible.

Sample Input

3

1033 8179

1373 8017

1033 1033

Sample Output

6

7

0

Source

NWERC2006

Recommend

wangye

题意:给你两个四位数,都是素数,每次改变可以改变其中的任何一个数字,但要求改变后的四位数(没有前导零)依然是素数,问最少改变几次可以使得第一个数改为第二个数

思路:可以先用埃氏筛法把1000-9999的所有的素数都选出来,之后就四个位数,每个位数最多改变八次,就搜索一下,我开了isprime和step两个数组,当然也可以开一个结构体,但只改变一个数字需要花点功夫,我是枚举了个位,十位,百位,千位。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<set>
#include<vector>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-10
#define PI acos(-1.0)
#define ll long long
int const maxn = 9999;
const int mod = 1e9 + 7;
int gcd(int a, int b) {
    if (b == 0) return a;  return gcd(b, a % b);
}

bool isprime[maxn];
int step[maxn];
bool vis[maxn];
int num1,num2;
void getprime(int n)
{
    for(int i=0;i<=n;i++)
        isprime[i]=true;
    isprime[0]=isprime[1]=false;
    for(int i=2;i<=n;i++)
    {
        for(int j=2*i;j<=n;j=j+i)
            isprime[j]=false;
    }
}

int bfs(int st )
{

    vis[st]=true;
    step[st]=0;
    queue<int>que;
    que.push(st);
    while(que.size())
    {
        int p=que.front();
        que.pop();
        if(p == num2)
        {
            return step[num2];
            break;
        }
        int ge=p % 10;
        int shi=(p/10)%10;
        int bai=(p/100)%10;
        int qian=p/1000;
        for(int i=0;i<=9;i++)
        {
            int next;
            if(i!=ge)
            {
                next=p-ge+i;
                if(next>=1000 && next<=9999 && isprime[next] && vis[next]==false)
                {
                    step[next]=step[p]+1;
                    que.push(next);
                    vis[next]=true;
                    //   cout<<"ge";
                }
            }
            if(i!=shi)
            {
                next=p-shi*10+i*10;
                if(next>=1000 && next<=9999 && isprime[next] && vis[next]==false)
                {
                    step[next]=step[p]+1;
                    que.push(next);
                    vis[next]=true;
                //    cout<<"shi";
                }
            }
            if(i!=bai)
            {
                next=p-bai*100+i*100;
                if(next>=1000 && next<=9999 && isprime[next] && vis[next]==false)
                {
                    step[next]=step[p]+1;
                    que.push(next);
                    vis[next]=true;
                //    cout<<"bai";
                }
            }
            if(i!=qian)
            {
                next=p-qian*1000+i*1000;
                if(next>=1000 && next<=9999 && isprime[next] && vis[next]==false)
                {
                    step[next]=step[p]+1;
                    que.push(next);
                    vis[next]=true;
               //     cout<<"qian";
                }
            }
        }

    }
    return -1;
}
int main()
{
    int t;
    scanf("%d",&t);
    getprime(9999);
    while(t--)
    {
        memset(vis,false,sizeof(vis));
        memset(step,0,sizeof(step));
        scanf("%d %d",&num1,&num2);

//        for(int i=2;i<=9999;i++)
//            if(isprime[i])
//                cout<<i<<" ";
        int ans=bfs(num1);
        if(ans>=0)
          printf("%d\n",ans);
        else
            printf("Impossible\n");
    }
}

原文地址:https://www.cnblogs.com/smallhester/p/9567606.html

时间: 2024-10-17 19:03:18

HDU - 1973 - Prime Path (BFS)的相关文章

POJ 3126 Prime Path(BFS)

Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12060   Accepted: 6843 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-dig

poj3126——Prime Path(BFS)

Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. - It is a matter of security to change such things every now

POJ 3216 Prime Path (BFS)

The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. — It is a matter of security to change such things every now and then, to

Sicily 1444: Prime Path(BFS)

题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 bool isPrime(int n){//素数判断 5 if(n == 2 || n == 3) return true; 6 else{ 7 int k = sqrt(n) + 1; 8 for(int i = 2; i < k; i

POJ 3126 Prime Path (BFS)

[题目链接]click here~~ [题目大意]给你n,m各自是素数,求由n到m变化的步骤数,规定每一步仅仅能改变个十百千一位的数,且变化得到的每个数也为素数 [解题思路]和poj 3278类似.bfs+queue,分别枚举个十百千的每一位就能够了,只是注意个位仅仅能为奇数,且千位从1開始 代码: #ifndef _GLIBCXX_NO_ASSERT #include <cassert> #endif #include <cctype> #include <cerrno&g

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

HDU 1728 逃离迷宫(BFS)

Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的.我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可

hdu 1973 Prime Path

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1973 Prime Path Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices

POJ 3126 Prime Path (bfs+欧拉线性素数筛)

Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. - It is a matter of security to change such things every now