poj3126--Prime Path(广搜)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 11751 | Accepted: 6673 |
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 numberson 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
给出两个数s,e,都是素数。经过转化,将s转化为e的最小步数
规则,每一次仅仅能改动一位,每次得到的数都是素数。
素数筛跑出1000到10000内的全部素数。假设当中两个素数仅仅有一位不同。那么连接一条边。得到全部素数组合的图后用bfs直接搜索就能够
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
int a[11000] , check[11000] , tot ;
struct node{
int v , next ;
}p[2000000];
struct node1{
int u , t ;
};
queue <node1> que ;
int head[10000] , cnt , flag[10000] ;
void add(int u,int v)
{
p[cnt].v = v ;
p[cnt].next = head[u] ;
head[u] = cnt++ ;
}
void init()
{
memset(check,0,sizeof(check));
memset(head,-1,sizeof(head));
tot = cnt = 0 ;
int i , j , k , num ;
for(i = 2 ; i <= 10000 ; i++)
{
if( !check[i] )
a[tot++] = i ;
for(j = 0 ; j < tot ; j++)
{
if(i*a[j] >= 10000)
break;
check[i*a[j]] = 1 ;
if( i%a[j] == 0 )
break;
}
}
for(i = 0 ; i < tot ; i++)
if( (a[i]/1000) ) break;
k = i ;
for(i = k ; i < tot ; i++)
{
for(j = k ; j < i ; j++)
{
num = 0 ;
if( a[i]%10 != a[j]%10 )
num++ ;
if( a[i]/10%10 != a[j]/10%10 )
num++ ;
if( a[i]/100%10 != a[j]/100%10 )
num++ ;
if( a[i]/1000%10 != a[j]/1000%10 )
num++ ;
if(num == 1)
{
add(i,j);
add(j,i);
}
}
}
}
int find1(int x)
{
int low = 0 , mid , high = tot-1 ;
while(low <= high)
{
mid = (low+high)/2 ;
if(a[mid] == x)
return mid ;
else if(a[mid] < x)
low = mid + 1 ;
else
high = mid -1 ;
}
}
int bfs(int s,int e)
{
memset(flag,0,sizeof(flag));
while( !que.empty() )
que.pop();
int i , j , v ;
node1 low , high ;
low.u = s ;
low.t = 0 ;
flag[s] = 1 ;
que.push(low);
while( !que.empty() )
{
low = que.front();
que.pop();
if( low.u == e )
return low.t ;
for(i = head[low.u] ; i != -1 ; i = p[i].next)
{
v = p[i].v ;
if( !flag[v] )
{
flag[v] = 1;
high.u = v ;
high.t = low.t + 1 ;
que.push(high);
}
}
}
return 0;
}
int main()
{
int t , s , e ;
init();
scanf("%d", &t);
while(t--)
{
scanf("%d %d", &s, &e);
s = find1(s);
e = find1(e);
printf("%d\n", bfs(s,e) );
}
return 0;
}
poj3126--Prime Path(广搜)的更多相关文章
- poj3126 Prime Path 广搜bfs
题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...
- POJ3126 Prime Path (bfs+素数判断)
POJ3126 Prime Path 一开始想通过终点值双向查找,从最高位开始依次递减或递增,每次找到最接近终点值的素数,后来发现这样找,即使找到,也可能不是最短路径, 而且代码实现起来特别麻烦,后来 ...
- POJ3126——Prime Path
非常水的一道广搜题(专业刷水题). .. #include<iostream> #include<cstdio> #include<queue> #include& ...
- poj3126 Prime Path(c语言)
Prime Path Description The ministers of the cabinet were quite upset by the message from the Chief ...
- POJ3126 Prime Path —— BFS + 素数表
题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- POJ3126 Prime Path
http://poj.org/problem?id=3126 题目大意:给两个数四位数m, n, m的位数各个位改变一位0 —— 9使得改变后的数为素数, 问经过多少次变化使其等于n 如: 10331 ...
- POJ3126 Prime Path(BFS)
题目链接. AC代码如下: #include <iostream> #include <cstdio> #include <cstring> #include &l ...
- 双向广搜 POJ 3126 Prime Path
POJ 3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16204 Accepted ...
- POJ 3126 Prime Path 简单广搜(BFS)
题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...
随机推荐
- Tornado入门资料整理
预备知识 没学过计网的苦逼找点现成一些的东西看吧…… <Restful Web Services>,<HTTP The Definitive Guide>,各种RFC WSGI ...
- Eclipse中用两个控制台测试网络通信程序
1.启动发送端和接收端程序,这时在控制台可以看到两个程序在运行,如下图. 2.这种情况下只有一个控制台窗口,不便于测试程序,于是新建一个控制台窗口,如下图. 3.这时可以发现已经有了两个控制台窗口了, ...
- 移动端禁止图片长按和vivo手机点击img标签放大图片,禁止长按识别二维码或保存图片【转载】
移动端禁止图片长按和vivo手机点击img标签放大图片,禁止长按识别二维码或保存图片 img{ pointer-events: none; } 源文地址:https://www.cnblogs.com ...
- Java 中 List 向前和向后遍历
Java 中 List 向前和向后遍历 import java.util.*; public class TestCollectionIterator { public static void mai ...
- thinkjs项目中使用mongoose需要注意的地方
原文链接thinkjs项目中使用mongoose需要注意的地方 由于thinkjs不支持mongodb的关联模型查询,所以我不得不使用mongoose这个第三方odm. 我有两个选择,一是像我在exp ...
- vue表格导入
<input id="upload" type="file" @change="importfxx(this)" accept=&q ...
- java 数组操作方法
数组操作方法: 实现数组拷贝: 语法:System.arraycopy(源数组名称,源数组拷贝开始索引,目标数组名称,目标数组拷贝数组索引,长度) 数组A:1 . 2 . 3 . 4 . 5 . 6 ...
- ORACLE里怎么能判断一个日期类型的字段是否为空,解决方法:is null
ORACLE里怎么能判断一个日期类型的字段是否为空,解决方法:is null,解决方法:判断什么null都可以用is null.
- codevs 1102 采药 2005年NOIP全国联赛普及组
1102 采药 2005年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最 ...
- BZOJ1016 JSOI2008最小生成树计数
定理,在所有最小生成树中,相同边权的边出现的次数相同. 由于重复边权小于10条,可以跑2^10暴力 #include<bits/stdc++.h> using namespace std; ...