POJ-3126-Prime Path(BFS)
Prime Path
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 27852 | Accepted: 15204 | 
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
大致题意:
给定两个四位素数a b,要求把a变换到b
变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复。 不得有前导零!
求从a到b最少需要的变换次数。无法变换则输出Impossible
广度优先搜索
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
const int N = 10000;
bool visit[N];
bool Notprime[N];
int dist[N];
void GetNotPrimeVisit (  )
{
    int i, j;
    for( i=2; i<=N; i++ )
        for( j=i<<1; j<=N; j+=i )
            Notprime[j] = true;
    fill( Notprime, Notprime+1000, true );        //以防万一把前一千个数去掉
}
int getnumber[45];
int x;
void SwapNumber( int v )
{
    x = 0;
    int i, a, b, c, d, n;
    a = v / 1000;
    b = v / 100 % 10;
    c = v % 100 / 10;
    d = v % 10;
    n = v - a * 1000;
    for( i=1; i<10; i++ )
        getnumber[x++] = n + i * 1000;
    n = v - b * 100;
    for( i=0; i<10; i++ )
        getnumber[x++] = n + i * 100;
    n = v - c * 10;
    for( i=0; i<10; i++ )
        getnumber[x++] = n + i * 10;
    n = v - d;
    for( i=0; i<10; i++ )
        getnumber[x++] = n + i;
}
queue <int> Q;
void BFS ( int a, int b )
{
    int i, j, v;
    int n = a;
    Q.push( n );
    visit[n] = true;
    while( !Q.empty() )
    {
        v = Q.front();
        if( v == b ) break;
        Q.pop();
        SwapNumber( v );                          //得到40个入口
        for( j=0; j<x; j++ )
        {
            i = getnumber[j];
            if( !Notprime[i] && !visit[i] )       //使用素数表和visit剪枝
            {
                Q.push( i );
                dist[i] = dist[v] + 1;
                visit[i] = true;
            }
        }
    }
    if( !Q.empty() ) cout << dist[v] << endl;
    else cout << "Impossible" << endl;
}
int main()
{
    GetNotPrimeVisit();                           //得到素数表
    int t;
    cin >> t;
    while( t-- )
    {
        fill( visit, visit+N, false );            //初始化
        fill( dist, dist+N, 0 );                  //初始化
        while( !Q.empty() ) Q.pop();              //初始化,清空队列
        int a, b;
        cin >> a >> b;
        BFS( a, b );                              //广搜
    }
    return 0;
}
												
											POJ-3126-Prime Path(BFS)的更多相关文章
- POJ  3126 Prime Path  (BFS)
		
[题目链接]click here~~ [题目大意]给你n,m各自是素数,求由n到m变化的步骤数,规定每一步仅仅能改变个十百千一位的数,且变化得到的每个数也为素数 [解题思路]和poj 3278类似.b ...
 - POJ 3126 Prime Path(BFS算法)
		
思路:宽度优先搜索(BFS算法) #include<iostream> #include<stdio.h> #include<cmath> #include< ...
 - POJ 3126 Prime Path (bfs+欧拉线性素数筛)
		
Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...
 - POJ - 3126 - Prime Path(BFS)
		
Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...
 - POJ 3126 Prime Path(素数路径)
		
POJ 3126 Prime Path(素数路径) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 The minister ...
 - 【POJ - 3126】Prime Path(bfs)
		
Prime Path 原文是English 这里直接上中文了 Descriptions: 给你两个四位的素数a,b.a可以改变某一位上的数字变成c,但只有当c也是四位的素数时才能进行这种改变.请你计算 ...
 - poj 3126 Prime Path(搜索专题)
		
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20237 Accepted: 11282 Desc ...
 - HDU - 1973 - Prime Path (BFS)
		
Prime Path Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
 - Prime Path(BFS)
		
Prime Path Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) Total S ...
 - (简单)  POJ  3126  Prime Path,BFS。
		
Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...
 
随机推荐
- 使用 XML-RPC 为 C++ 应用程序启用 Web 服务
			
http://www.ibm.com/developerworks/cn/webservices/ws-xml-rpc/ 引言 Internet 现在的受欢迎程度越来越高,由于这个原因及其固有的优势, ...
 - 基于jquery的ajax方法封装
			
在实际的项目里,ajax的应用频率很高,所以尽管jquery或者其他的一些类似的js库做了非常不错的封装,仍然有进一步封装简化的空间和必要 举一个例子,很久很久以前,我的ajax是这么写的: $.aj ...
 - cs231n(一)
			
1.Nearest Neighbor Classifier 计算未分类数据(图片)与已标记类别的训练数据(training set)的距离(L1,L2等距离),然后返回与训练数据(图片)最小距离的图片 ...
 - Insufficient free space for journal files
			
前两天请假了,公司的很多app突然挂掉了,说是mongodb莫名的挂掉了,赶紧进去看了看日志: --31T14:: [initandlisten] ERROR: Insufficient free s ...
 - NAT穿透的详细讲解及分析.RP
			
原创出处:https://bbs.pediy.com/thread-131961.htm 转载来源: https://blog.csdn.net/g_brightboy/article/details ...
 - 关于设置了setMaxAge(0)而浏览器未成功删除Cookie的注意事项
			
最近做了个系统,其中涉及到对Cookie的操作.当用户登录时,设置一些数据到Cookie中,用户登出系统的时候删除写入浏览器中的对应Cookie.问题就出在登出系统时,在firebug中看到需要删除的 ...
 - Karma和Jasmine  自动化单元测试环境搭建
			
最近初学AngularJS ,看到的一些教程中经常有人推荐使用Karma+Jasmine来进行单元测试.自己之前也对Jasmine有些了解,jasmine也是一个不错的测试框架. 1. karma介绍 ...
 - JPA和Hibernate的相关使用技巧
			
介绍 尽管有SQL标准,但每个关系数据库终将是唯一的,因此你需要调整数据访问层,以便充分利用在使用中的关系数据库. 在本文中,我们将介绍在使用带有JPA和Hibernate的MySQL时,为了提高性能 ...
 - 螺旋折线——第九届蓝桥杯C语言B组(省赛)第七题
			
原创 如图p1.png所示的螺旋折线经过平面上所有整点恰好一次. 对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度. 例如dis(0, 1)=3, ...
 - 系统数据库--恢复Master数据库
			
实现步骤:关闭SQL SERVER 服务,使用DAC登录 在cmd下还原master 重启SQL SERVER 服务