题目链接:传送门

题意:

给定两个四位数a。b,每次能够改变a的随意一位。而且确保改变后的a是一个素数。

问最少经过多少次改变a能够变成b.

分析:

BFS,每次枚举改变的数,有一个剪枝,就是假设这个改变的数之前已经得到过了,

就没有必要继续变回它了。

代码例如以下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std; struct nod{
int a,b,c,d;
int step;
nod(){}
nod(int _a,int _b,int _c,int _d):a(_a),b(_b),c(_c),d(_d){}
}; int l,r;
int vis[10010]; bool check(int x){
for(int i=2;i*i<=x;i++)
if(x%i==0) return false;
return true;
} bool isequal(nod tmp1,nod tmp2){
if(tmp1.a==tmp2.a&&tmp1.b==tmp2.b&&tmp1.c==tmp2.c&&tmp1.d==tmp2.d)
return true;
return false;
} void bfs(){
queue<nod> Q;
nod tmp,ans;
tmp.a=l%10,l/=10;
tmp.b=l%10,l/=10;
tmp.c=l%10,l/=10;
tmp.d=l%10;
tmp.step=0;
ans.a=r%10,r/=10;
ans.b=r%10,r/=10;
ans.c=r%10,r/=10;
ans.d=r%10;
Q.push(tmp);
while(!Q.empty()){
nod top = Q.front();
Q.pop();
if(isequal(top,ans)){
printf("%d\n",top.step);
return ;
}
for(int i=1;i<=9;i+=2){
if(i!=top.a){
tmp=nod(i,top.b,top.c,top.d);
tmp.step=top.step+1;
if(check(i+top.b*10+top.c*100+top.d*1000)&&!vis[i+top.b*10+top.c*100+top.d*1000]){
Q.push(tmp);
vis[i+top.b*10+top.c*100+top.d*1000]=1;
}
}
}
for(int i=0;i<=9;i++){
if(i!=top.b){
tmp=nod(top.a,i,top.c,top.d);
tmp.step=top.step+1;
if(check(i*10+top.a+top.c*100+top.d*1000)&&!vis[i*10+top.a+top.c*100+top.d*1000]){
Q.push(tmp);
vis[i*10+top.a+top.c*100+top.d*1000];
}
}
}
for(int i=0;i<=9;i++){
if(i!=top.c){
tmp=nod(top.a,top.b,i,top.d);
tmp.step=top.step+1;
if(check(i*100+top.b*10+top.a+top.d*1000)&&!vis[i*100+top.b*10+top.a+top.d*1000]){
Q.push(tmp);
vis[i*100+top.b*10+top.a+top.d*1000]=1;
}
}
}
for(int i=1;i<=9;i++){
if(i!=top.d){
tmp=nod(top.a,top.b,top.c,i);
tmp.step=top.step+1;
if(check(top.a+top.b*10+top.c*100+i*1000)&&!vis[top.a+top.b*10+top.c*100+i*1000]){
Q.push(tmp);
vis[top.a+top.b*10+top.c*100+i*1000]=1;
}
}
}
}
puts("Impossible");
return;
} int main()
{
int n;
scanf("%d",&n);
while(n--){
scanf("%d%d",&l,&r);
memset(vis,0,sizeof(vis));
bfs();
}
return 0;
}

POJ 3126 Prime Path (BFS+剪枝)的更多相关文章

  1. poj 3126 Prime Path bfs

    题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  2. POJ 3126 Prime Path(BFS 数字处理)

    意甲冠军  给你两个4位质数a, b  每次你可以改变a个位数,但仍然需要素数的变化  乞讨a有多少次的能力,至少修改成b 基础的bfs  注意数的处理即可了  出队一个数  然后入队全部能够由这个素 ...

  3. poj 3126 Prime Path( bfs + 素数)

    题目:http://poj.org/problem?id=3126 题意:给定两个四位数,求从前一个数变到后一个数最少需要几步,改变的原则是每次只能改变某一位上的一个数,而且每次改变得到的必须是一个素 ...

  4. POJ 3126 Prime Path bfs, 水题 难度:0

    题目 http://poj.org/problem?id=3126 题意 多组数据,每组数据有一个起点四位数s, 要变为终点四位数e, 此处s和e都是大于1000的质数,现在要找一个最短的路径把s变为 ...

  5. POJ 3126 Prime Path(BFS求“最短路”)

    题意:给出两个四位数的素数,按如下规则变换,使得将第一位数变换成第二位数的花费最少,输出最少值,否则输出0. 每次只能变换四位数的其中一位数,使得变换后的数也为素数,每次变换都需要1英镑(即使换上的数 ...

  6. POJ 3126 Prime Path BFS搜索

    题意:就是找最短的四位数素数路径 分析:然后BFS随便搜一下,复杂度最多是所有的四位素数的个数 #include<cstdio> #include<algorithm> #in ...

  7. POJ 3126 Prime Path (BFS + 素数筛)

    链接 : Here! 思路 : 素数表 + BFS, 对于每个数字来说, 有四个替换位置, 每个替换位置有10种方案(对于最高位只有9种), 因此直接用 BFS 搜索目标状态即可. 搜索的空间也不大. ...

  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. MVC中Model和model的区别和用户

    MVC中Model和model的区别,它们应该怎么用呢? 使用@model关键字可以定义一个Action里所对应的一个模型(经常可以叫他实体类). MVC的第一个字母M是Model,承载着View层和 ...

  2. 通过GitHub部署项目到Nginx服务器

    1.更新源: 2.安装nginx 3.安装成功 4.DNS域名解析 5.访问域名就会找到相应IP地址的主机,一个IP可对应多个域名 6.提交到gitHub 复制这两行 填上邮箱和密码 7.提交成功 8 ...

  3. Delphi 的TSpeedButton按下和弹起效果

    想达到这样的效果: 点击一下TSpeedButton按钮,按钮凹下去,再点击一下,按钮弹起恢复. 实现方法: 只要设置下述2个属性即可,不需要编码: ①AllowAllUp = True ②Group ...

  4. 51nod 1137.矩阵乘法-矩阵乘法

    1137 矩阵乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果.   Input 第1行:1个数N, ...

  5. 2-SAT浅谈

    2-SAT浅谈 一.2-SAT问题 首先,什么是$2-SAT$问题.现在给出这样一类问题:给出$n$个点和关于这$n$个点的$m$条限制条件,并且这$n$个点中,每一个点只有两种状态.对于上述问题,我 ...

  6. static静态变量-投票案例

    public class Voter { String name; //名字 private static int count; //投票数 public Voter() {} public Vote ...

  7. C++中static、const使用方法简介

    众所周知,在c++中,static和const的使用方法是难点,也是重点,值得我们随时温习,所谓温故而知新是也. 下面我们首先说一说static. 1.static的作用 static变量的作用,主要 ...

  8. noip2017集训测试赛(十一)Problem C: 循环移位

    题面 Description 给定一个字符串 ss .现在问你有多少个本质不同的 ss 的子串 t=t1t2⋯tm(m>0)t=t1t2⋯tm(m>0) 使得将 tt 循环左移一位后变成的 ...

  9. IMAP IDLE模式(推送邮件)

    在电子邮件技术中,IDLE是RFC 2177中描述的一项IMAP功能,它允许客户端向服务器表明它已准备好接受实时通知. Internet消息访问协议IMAP4协议,它要求客户端轮询服务器来更改所选中的 ...

  10. 修改Tomcat标题栏内容

    你是否遇到过在一个OS任务栏中同时打开多个Tomcat启动程序窗口,这种情况下你会无法区分具体是哪个窗口启动哪个程序,以下方式可以实现Bat启动程序标题栏自定义. 打开Tomcat的Bin目录中,打开 ...