题目描述
内阁大臣非常的沮丧,他收到了安全部长的消息:他们都需要改变办公空的四位房间号码。
安全部长:经常换换房间号码是出于安全方面的考虑,可以让敌人陷入迷惑。
内阁大臣:但是,我选择1033作为我的房间号是出于我个人的偏爱。我可是内阁大臣!
安全部长:你不就是喜欢素数么?我们给你安排了8179这个号码,你只需要贴四个新数字覆盖住以前的四个老数字就可以了。
内阁大臣:不行,没有那么容易。当我把1033的1用8盖住的时候,8033可不是个素数!
安全部长:我知道,你不能允计你的门上出现非素数。
内阁大臣:正确!所以我必须找到一个方法从1033修改到8179,使得过程中门上出现的永远是素数,而且每次只能够修改当前数字的一位。
这个叫候,在旁边偷听的财政大臣忍不住来插嘴。
财政大臣:千万不要为了这么个事情增加不必要的开支!我知道换一个数字就是要化一镑!
内阁大臣:那我需要一个计算机来规划一下。
财政大臣:我够够帮你!
现在这个任务就交给你了。你要从一个四位的素数出发,每次修改其中的一位,并且要保证修改的结果还是一个素数,还不能出现前导零。你要找到一个修改次数最少的方案,得到我们所需要的素数。
关于1033怎么变到8179,这里是一个最短的方策:
1033
1733
3733
3739
3779
8779
8179
修改了6次,所以要花6镑。
输入输出格式
输入格式:一行,两个四位的素数(没有前导零),表示初始数和目标数。
输出格式:一个数,表示最少的操作次数。如果不可能,输出“Impossible”。
输入输出样例
1033 8179
6
分析
刚开始看到这道题以为是深搜,后来才知道其实是图论题。
我们很容易想到 把1000至9999内的质数当成点
将这些点两两比较 如果这两个数之间有且仅有一位数字相同 则将这两个点用边权为1的边连起来
这样处理之后 次数最少的更换方式就变成了 求起点到终点的最短路
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#define MAXH 1062
#define MAXN 10000
#define MAXM 500050
#define INF 0x7f7f7f7f
using namespace std;
int prime[MAXN]={0,1009,1013,1019,1021,1031,1033,1039,1049,10