双向广搜 POJ 3126 Prime Path
POJ 3126 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. — 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.
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 Sample Output 6 大致题意: 给定两个四位素数a b,要求把a变换到b 变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复。 求从a到b最少需要的变换次数。无法变换则输出Impossible 注意:双向广搜是在一个队列中实现的,只不过是交替进行罢了! |
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#define N 10000
struct prime{
int c[];
int flag;
};
int dis[N];
int visit[N];
queue<prime>que;
int js(int *m)
{
return (m[]*+m[]*+m[]*+m[]*);
}
bool is_prime(int l)
{
bool flag=true;
for(int i=;i<=sqrt(l);++i)
{
if(l%i==)
{
flag=false;
break;
}
}
return flag;
}
int bfs()
{
while(!que.empty())
{
prime x=que.front();
que.pop();
int now=js(x.c);
for(int i=;i<=;++i)
{
prime nx=x;
nx.c[]=i;
int shu=js(nx.c);
if(!visit[shu]&&is_prime(shu))
{
visit[shu]=x.flag;
nx.flag=x.flag;
que.push(nx);
dis[shu]=dis[now]+;
}
else if(visit[shu]&&visit[shu]!=x.flag)
{
return dis[now]+dis[shu]+;
}
}
for(int j=;j<=;++j)
{
for(int i=;i<=;++i)
{
prime nx=x;
nx.c[j]=i;
int shu=js(nx.c);
if(!visit[shu]&&is_prime(shu))
{
visit[shu]=x.flag;
nx.flag=x.flag;
que.push(nx);
dis[shu]=dis[now]+;
}
else if(visit[shu]&&visit[shu]!=x.flag)
{
return dis[now]+dis[shu]+;
}
} }
}
return -;
}
int main()
{
int tex;
scanf("%d",&tex);
char a[];
while(tex--)
{
while(!que.empty()) que.pop();
memset(dis,,sizeof(dis));
memset(visit,,sizeof(visit));
scanf("%s",a);
que.push(prime{a[]-'',a[]-'',a[]-'',a[]-'',});
int p=(a[]-'')*+(a[]-'')*+(a[]-'')*+(a[]-'');
visit[p]=;dis[p]=;
int q=p;
scanf("%s",a);
que.push(prime{a[]-'',a[]-'',a[]-'',a[]-'',});
p=(a[]-'')*+(a[]-'')*+(a[]-'')*+(a[]-'');
visit[p]=;dis[p]=;
if(q==p)
{
printf("0\n");continue;
}
int temp=bfs();
if(temp==-) printf("Impossible\n");
else printf("%d\n",temp);
}
return ;
}
双向广搜 POJ 3126 Prime Path的更多相关文章
- POJ 3126 Prime Path(素数路径)
POJ 3126 Prime Path(素数路径) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 The minister ...
- BFS POJ 3126 Prime Path
题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...
- poj 3126 Prime Path bfs
题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- POJ 3126 Prime Path 简单广搜(BFS)
题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...
- POJ - 3126 - Prime Path(BFS)
Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...
- (简单) 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 数字处理)
意甲冠军 给你两个4位质数a, b 每次你可以改变a个位数,但仍然需要素数的变化 乞讨a有多少次的能力,至少修改成b 基础的bfs 注意数的处理即可了 出队一个数 然后入队全部能够由这个素 ...
- poj 3126 Prime Path(搜索专题)
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20237 Accepted: 11282 Desc ...
- POJ 3126 Prime Path【从一个素数变为另一个素数的最少步数/BFS】
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26475 Accepted: 14555 Descript ...
随机推荐
- MySQL更新优化
通常情况下,当访问某张表的时候,读取者首先必须获取该表的锁,如果有写入操作到达,那么写入者一直等待读取者完成操作(查询开始之后就不能中断,因此允许读取者完成操作).当读取者完成对表的操作的时候,锁就会 ...
- C语言回滚(三)-指针
#include <stdio.h>#include <stdlib.h> //& 地址运算符 //* 间接运算符 // *的作用 当*后面跟一个指针名或地址的时候, ...
- Oracle 查询并删除重复记录的SQL语句
查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select ...
- R语言归一化处理
归一化化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内.首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快. R语言中的归一化函数:scale 数据归一化包括 ...
- 通过GPS数据反向地理信息编码, 得到当前位置信息
检查可用性 这属于基础知识, 不赘述, 总的来说,你的设备的支持要打开, 添加CoreLocation的framework, 引用头文件, 添加委托,然后, 好的实践是在使用前编程检查相关可用性: - ...
- SVG描边动画原理
SVG描边动画原理其实很简单,主要利用以下两个属性 stroke-dasharray 制作虚线,使得黑白相间, stroke-dashoffset 使得虚线向开头偏移,这里的1500不精确,是我随便取 ...
- Microsoft Dynamics CRM 2011/2013 JS操作集锦
1.Xrm.Page.context用户ID:getUserId()用户角色:getUserRoles()用户语言:getUserLcid()组织名称:getOrgUniqueName()组织语言:g ...
- Error occurred in deployment step 'Add Solution': Operation is not valid due to the current state of the object.
Sharepoint 部署的时候出现一个错误 Error occurred in deployment step 'Add Solution': Operation is not valid due ...
- iOS 核心动画
核心动画(Core Animation) : •CoreAnimation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.fr ...
- Objective-C Reflection(Objective-C 反射机制)实用随笔笔记(持续更新)
前言:本篇文章就"Objective-C 反射机制"使用方面进行叙述,不会涉及太多理论论述,因为"Objective-C 反射机制"理论论述在网上搜索一大把,本 ...
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.