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

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,求最少的变换次数。bfs求最少的次数!(变换的要求请读题目)
一开始在记录一个数是否被访问过的时候,用了一种比较的方式,即:比较当前要生成的数和cur是否相同,这种
判断是否该数字是否访问过的方法是不对的,因为这样判断还是会导致一个数可能会被多次加入队列,最后TLE。
故,改为vis[]标记判断是否访问过,这样每个数顶多会被加入队列一次。AC!
代码:
 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <cmath>
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#define N 100000+100 using namespace std; struct node
{
int a, b, c, d; //a不能等于0
int path;
}; int f[];
bool vis[]; void sushu()
{
int i, dd=sqrt(+0.5);
memset(f, , sizeof(f));
i=; f[]=f[]=; //not
while(i<=dd){
for(int j=i+i; j<=; j+=i)
f[j]=; // not
i++;
while(f[i]==) i++;
}
} int main()
{
sushu(); //筛素数
// printf("%d %d", f[1001], f[1003] ); int tg; scanf("%d", &tg);
int dd, ff;
int i, j; while(tg--){
scanf("%d %d", &dd, &ff);
if(dd==ff){
printf("0\n"); continue;
}
node s, e;
s.a=dd/; s.b=dd/%; s.c=dd/%; s.d=dd%; s.path=;
e.a=ff/; e.b=ff/%; e.c=ff/%; e.d=ff%; queue<node>q; bool flag=false;
q.push(s); node cur;
int ans=;
memset(vis, false, sizeof(vis));
vis[dd]=true; while(!q.empty()){
cur=q.front(); q.pop(); for(i=; i<=; i+=){//枚举个位 偶数排除
int temp=cur.a*+cur.b*+cur.c*+i;
if(!vis[temp] && f[temp]==){
node cc=cur; cc.d=i; cc.path=cur.path+;
vis[temp]=true;
if(temp==ff){
flag=true; ans=cc.path; break;
}
q.push(cc);
}
}
if(flag) break; for(i=; i<=; i++){ //枚举个位 int temp=cur.a*+cur.b*+i*+cur.d;
if(!vis[temp] &&f[temp]==){
node cc=cur; cc.c=i; cc.path=cur.path+;
vis[temp]=true;
if(temp==ff){
flag=true; ans=cc.path; break;
}
q.push(cc);
}
}
if(flag) break; for(i=; i<=; i++){//枚举百位
int temp=cur.a*+i*+cur.c*+cur.d;
if(!vis[temp] &&f[temp]==){
node cc=cur; cc.b=i; cc.path=cur.path+;
vis[temp]=true;
if(temp==ff){
flag=true; ans=cc.path; break;
}
q.push(cc);
}
}
if(flag) break; for(i=; i<=; i++){ //枚举千位 千位不能为0
int temp=i*+cur.b*+cur.c*+cur.d;
if(!vis[temp] &&f[temp]==){
node cc=cur; cc.a=i; cc.path=cur.path+;
vis[temp]=true;
if(temp==ff){
flag=true; ans=cc.path; break;
}
q.push(cc);
}
}
if(flag) break;
}
if(flag) printf("%d\n", ans );
else printf("Impossible\n");
}
return ;
}
												

poj 3126 Prime Path 【bfs】的更多相关文章

  1. POJ 3126 Prime Path【BFS】

    <题目链接> 题目大意: 给你两个四位数,它们均为素数,以第一个四位数作为起点,每次能够变换该四位数的任意一位,变换后的四位数也必须是素数,问你是否能够通过变换使得第一个四位数变成第二个四 ...

  2. POJ 3126 Prime Path【从一个素数变为另一个素数的最少步数/BFS】

    Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26475 Accepted: 14555 Descript ...

  3. POJ - 3126 - Prime Path(BFS)

    Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...

  4. (简单) POJ 3126 Prime Path,BFS。

    Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...

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

    Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...

  6. POJ 3126 Prime Path (BFS)

    [题目链接]click here~~ [题目大意]给你n,m各自是素数,求由n到m变化的步骤数,规定每一步仅仅能改变个十百千一位的数,且变化得到的每个数也为素数 [解题思路]和poj 3278类似.b ...

  7. POJ 3126 Prime Path(BFS算法)

    思路:宽度优先搜索(BFS算法) #include<iostream> #include<stdio.h> #include<cmath> #include< ...

  8. BFS POJ 3126 Prime Path

    题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...

  9. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

随机推荐

  1. Memcache遍历查询所有键值的方法

    直接举个Telnet命令行下遍历memcached所有key的方法:   stats items STAT items:7:number1 STATitems:7:age188 END stats c ...

  2. Input 银行卡验证

    $("#card_num").keyup(function(){ var op=""; var t=$("#card_num").val() ...

  3. weex 学习

    相关资料和链接: # 官方网站https://weex.apache.org/cn/ # githubhttps://github.com/apache/incubator-weex # weex环境 ...

  4. Java 多线程 并发编程 (转)

    一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...

  5. TRIZ系列-创新原理-23-反馈原理

     反馈原理的详细表述例如以下:1)引入反馈:2)假设已经有反馈,那么改变它这个原理告诉我们应当从系统中尽量多收集反馈信息.并用这些信息来矫正系统的作用.非常easy看出,引入反馈是系统自己主动控制 ...

  6. Socket编程之Tomcat模拟_采坑汇总

    用java.net.Socket来模拟实现Tomcat,碰到了一些坑,大部分是没有想到的,记录下来自查. 直接上代码, public class TomcatDemo { private static ...

  7. 第3章 如何编写函数定义 3.7 if特殊表

    这部分来学习下if特殊表,之前学了defun和let,不好意思,博客中没有写但是鄙人已经看了,哈哈. 什么是if表 if条件特殊表是为了让计算机对条件加以判断,然后选择不同的执行路径的. if特殊表的 ...

  8. Linux下文件的堵塞与非堵塞对部分系统调用的影响

    1.基本概念 所谓的堵塞,即内核在对文件操作I/O系统调用时.假设条件不满足(可能须要产生I/O),则内核会将该进程挂起.非堵塞则是发现条件不满足就会马上返回. 此外须要注意的是非堵塞并非轮询.不然就 ...

  9. ASP.NET动态网站制作(17)-- C#(1)

    前言:用C#也有一年多了,基本上都是边用边学的,现在可以跟着老师系统的学习一下,感觉应该挺好的. 内容: 1.网站部署的相关内容:  (1)想要做一个网站,首先得去买一个域名,老师的域名是在美橙上买的 ...

  10. 【BZOJ4375】Selling Tickets 随机化

    [BZOJ4375]Selling Tickets Description 厨师在一次晚宴上准备了n道丰盛的菜肴,来自世界各地的m位顾客想要购买宴会的门票.每一位顾客都有两道特别喜爱的菜,而只要吃到了 ...