题目链接:https://vjudge.net/problem/POJ-3126

题意:给你两个四位的素数N,M,每次改变N四位数中的其中一位,如果能经过有限次数的替换变成四位数M,那么求出最少替换次数,否则输出“Impossible”.(N,M必须一直是素数)

思路:bfs。四位数,每一位可以替换为0~9,那么我们可以每次改变N中的一位数,然后放入队列中,当然,在替换数字时难免会出现重复的四位数,这样会造成TLE,那么我们可以创建一个bool数组标记出现过的,我们也需要素数筛999 ~ 10000之间的素数(你想删哪里到哪就到哪里,不要纠结),因为是bfs,所以第一次出现的新的四位素数一定是替换次数最少的,那么题目就简单了。


 #include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std; #define inf (1LL << 31) - 1
#define rep(i,j,k) for(int i = (j); i <= (k); i++)
#define rep__(i,j,k) for(int i = (j); i < (k); i++)
#define per(i,j,k) for(int i = (j); i >= (k); i--)
#define per__(i,j,k) for(int i = (j); i > (k); i--) const int N = (int)1e4 + ;
bool vis[N]; //素数表 0为素数
bool app[N]; //标记是否出现过
int ans; struct node{ int a[];
int cost; node(int* a,int e){
rep(i, , ){
this->a[i] = a[i];
}
this->cost = e;
} int x(){ //返回四位数的成员函数
int num = ;
rep(i, , ) num = num * + a[i];
return num;
}
}; void get_Prime(){ //素数打表 rep(i, , (int)sqrt(N*1.0)){
if (!vis[i]){
for (int p = i * i; p <= N; p += i) vis[p] = true;
}
}
} bool work(int x[], int y){ //true为有答案,false为没答案 queue<node> que;
node t (x,); app[t.x()] = true; que.push(t); if (t.x() == y){
ans = ;
return true;
} while (!que.empty()){ node tmp = que.front();
que.pop(); rep(i, , ){ //1~4不同位置
rep(j, , ){ //替换为0~9
if (i == && j == ) continue; //第一位不能是0
int tt = tmp.a[i]; //暂存该数
tmp.a[i] = j; //改变 //该四位数没有出现过且该数是素数
if (!app[tmp.x()] && !vis[tmp.x()]){ app[tmp.x()] = true; //标记一下 if (tmp.x() == y){ //如果变成了想变成的数了
ans = tmp.cost + ;
return true;
}
que.push(node{tmp.a,tmp.cost + }); //新的四位数放入队列,花费加一
}
tmp.a[i] = tt; //变回原来的四位数
}
} } return false;
} int main(){ ios::sync_with_stdio(false);
cin.tie(); get_Prime();//得到素数表
int n;
cin >> n; int a, b;
while (n--){ memset(app, , sizeof(app)); //每次初始化 cin >> a >> b; int aa[];
int len = ;
rep(i, , ){
aa[-len++] = a % ;
a /= ;
} //分割a变为四个数 //node tmp(aa, 0);
//cout << "tmp:::" << tmp.x() << endl; if (work(aa, b)) cout << ans << endl;
else cout << "Impossible" << endl;
} return ;
}

最新文章

  1. 移动设计必备:iPhone 5S PSD 矢量原型免费下载
  2. WordPress主题制作教程5:循环
  3. BS与CS的联系与区别
  4. jboss之mod_cluster集群
  5. iOS打电话
  6. JAVA 相关资料
  7. Error pulling origin: error: Your local changes to the following files would be overwritten by merge
  8. CocoaPods 更新慢&amp;swift版本适配
  9. asp.net中配置使用Sqlite轻型数据库
  10. node.js之用ajax获取数据和ejs获取数据
  11. xBIM 应用与学习 (一)
  12. 【重学计算机】机组D6章:中央处理器
  13. 策略模式-Strategy(Java实现)
  14. docker 安装 zookeeper
  15. 发布到FaceBook试玩广告,FaceBook要求要一个Html文件
  16. OAuth2.0深入理解
  17. CentOS7 上学习使用docker
  18. IIS7.5全站301跳转,内页+带参数url,这才是真正的全站跳转
  19. AE-----合成
  20. cp命令详解

热门文章

  1. Entity相互关系
  2. iOS 监听控件某个属性的改变observeValueForKeyPath
  3. SQL Server 数据库所有表增加同一列
  4. 零元学Expression Blend 4 - Chapter 24 以实作了解Cover Flow功能
  5. 关于XML异步
  6. postgresql Java JDBC 一次性传入多个参数到 in ( ?) - multple/list parameters
  7. AspNetCore 小记
  8. Qt系统对话框中文化及应用程序实现重启及使用QSS样式表文件及使用程序启动界面
  9. FMX有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法(firemonkey messaging)
  10. CEGUI 0.7.7 VS2010+SP3 编译过程