Prime Path(素数筛选+bfs)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 9519 | Accepted: 5458 |
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
Output
Sample Input
3
1033 8179
1373 8017
1033 1033
Sample Output
6
7
0
题意:给定两个四位数,求从前一个数变到后一个数最少需要几步,改变的原则是每次只能改变某一位上的一个数,而且每次改变得到的必须是一个素数; 思路:将四位数以内的素数筛选出来,bfs时,枚举四位数的每一位上的每一个数;
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; struct node
{
int num;
int step;
};
queue<struct node>que;
int n,m,flag;
bool p[],vis[]; //素数筛;
void prime_search()
{
memset(p,,sizeof(p));
for(int i = ; i <= ; i+=)
p[i] = ;
for(int i = ; i <= ; i++)
{
if(p[i])
{
for(int j = i+i; j <= ; j += i)
p[j] = ;
}
}
} int bfs()
{
while(!que.empty())
que.pop();
que.push((struct node){n,});
vis[n] = ;
int res,tmp,r,t,s;
while(!que.empty())
{
struct node u = que.front();
que.pop();
if(u.num == m)
return u.step; //枚举个位数
r = u.num%;
for(int k = -; k <= ; k++)
{
t = r+k;
if(t >= && t <= )
{
res = (u.num/)*+t;
if(p[res] && !vis[res])
{
que.push((struct node){res,u.step+});
vis[res] = ;
}
}
} //枚举十位数
tmp = u.num/;
r = tmp%;
s = tmp/;
for(int k = -; k <= ; k++)
{
t = r+k;
if(t >= && t <= )
{
res = (s*+t)*+u.num%;
if(p[res] && !vis[res])
{
que.push((struct node){res,u.step+});
vis[res] = ;
}
}
} //枚举百位数
int tmp = u.num/;
r = tmp%;
s = tmp/;
for(int k = -; k <= ; k++)
{
t = r+k;
if(t >= && t <= )
{
res = (s*+t)*+u.num%;
if(p[res] && !vis[res])
{
que.push((struct node){res,u.step+});
vis[res] = ;
}
}
} //枚举千位数
r = u.num/;
for(int k = -; k <= ; k++)
{
t = r+k;
if(t > && t <= )
{
res = t*+u.num%;
if(p[res] && !vis[res])
{
que.push((struct node){res,u.step+});
vis[res] = ;
}
}
}
}
}
int main()
{
int test;
prime_search();
scanf("%d",&test);
while(test--)
{
memset(vis,,sizeof(vis));
scanf("%d %d",&n,&m);
int ans = bfs();
printf("%d\n",ans);
}
return ;
}
Prime Path(素数筛选+bfs)的更多相关文章
- POJ - 3126 Prime Path 素数筛选+BFS
Prime Path The ministers of the cabinet were quite upset by the message from the Chief of Security s ...
- Prime Path素数筛与BFS动态规划
埃拉托斯特尼筛法(sieve of Eratosthenes ) 是古希腊数学家埃拉托斯特尼发明的计算素数的方法.对于求解不大于n的所有素数,我们先找出sqrt(n)内的所有素数p1到pk,其中k = ...
- poj3126 Prime Path 广搜bfs
题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...
- ZOJ 1842 Prime Distance(素数筛选法2次使用)
Prime Distance Time Limit: 2 Seconds Memory Limit: 65536 KB The branch of mathematics called nu ...
- POJ 3126 Prime Path 素数筛,bfs
题目: http://poj.org/problem?id=3126 困得不行了,没想到敲完一遍直接就A了,16ms,debug环节都没进行.人品啊. #include <stdio.h> ...
- POJ2689 - Prime Distance(素数筛选)
题目大意 给定两个数L和U,要求你求出在区间[L, U] 内所有素数中,相邻两个素数差值最小的两个素数C1和C2以及相邻两个素数差值最大的两个素数D1和D2,并且L-U<1,000,000 题解 ...
- POJ 3126 - Prime Path - [线性筛+BFS]
题目链接:http://poj.org/problem?id=3126 题意: 给定两个四位素数 $a,b$,要求把 $a$ 变换到 $b$.变换的过程每次只能改动一个数,要保证每次变换出来的数都是一 ...
- HDOJ(HDU) 2136 Largest prime factor(素数筛选)
Problem Description Everybody knows any number can be combined by the prime number. Now, your task i ...
- Prime Path[POJ3126] [SPFA/BFS]
描述 孤单的zydsg又一次孤单的度过了520,不过下一次不会再这样了.zydsg要做些改变,他想去和素数小姐姐约会. 所有的路口都被标号为了一个4位素数,zydsg现在的位置和素数小姐姐的家也是这样 ...
随机推荐
- Execution Contexts (执行上下文)
本章我们一起讨论一下ECMAScript的执行上下文及相关可执行代码的各种类型.so...什么是执行上下文?我们来看看定义: 每次当控制器转到ECMAScript可执行代码的时候, 即会进入到一个执行 ...
- HTTP协议 状态码详解
http://www.cnblogs.com/TankXiao/archive/2013/01/08/2818542.html
- HTML select 操作
今天遇到一个问题,就是想设置select的默认选择项.但是试了很多方法都不行: <fieldset data-role="contractstatus"> <la ...
- oracle中drop、delete和truncate的区别
oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...
- C蛮的全栈之路-序章 技术栈选择与全栈工程师
目录 C蛮的全栈之路-序章 技术栈选择与全栈工程师C蛮的全栈之路-node篇(一) 环境布置C蛮的全栈之路-node篇(二) 实战一:自动发博客 博主背景 985院校毕业,至今十年C++开发工作经验, ...
- javascript基础学习(十)
javascript之数组 学习要点: 数组的介绍 定义数组 数组元素 数组的方法 一.数组的介绍 数组中的元素类型可以是数字型.字符串型.布尔型等,甚至也可以是一个数组. 二.定义数组 1.通过数组 ...
- 显示scrollbar
修改CSS overflow的值 overflow: 参考MDN 例子: overflow: auto or scroll
- 初试ubuntu14.4问题集锦2
好的,我开始继续鼓捣. 想了这么长时间,我想到的是,肯定是compiz设置了unity的什么东西才导致这种问题,绝非什么显卡驱动的事情. 于是二话不说,开机登录,进入tty1,然后apt-get re ...
- Linux嘚瑟一时的Shared Object
场景概述 近来接触node程序以及负责实现node扩展来对象本地SDK的调用,旨在借node及其第三方库来快速实现RESTful API以及给浏览器端使用.当然这中间研究工作耗了不少时间. 在实现目标 ...
- angular post发送请求和GET发送请求,服务器端接收不到信息的问题
参数可能因为编码原因,服务器端无法接收到传递的值, 这时需要用到补丁来解决这个问题 1,下载一个http.patch.js文件,放入YII框架中的js/ng文件架内 2angularjs 创建模型部分 ...