首页 > 其他分享 >0623搜索专题-F题

0623搜索专题-F题

时间:2023-07-03 15:48:27浏览次数:43  
标签:prime 专题 数字 int tt vis step 搜索 0623

题目描述:

 

 读完题目大家有思路了吗?反正我有了:哪个**闲的没事干这b玩意,****。

整体思路算是比较暴力,就是将这个四位数的每一位都拆解开来,让每位都从0-9挨个换一遍,组成一个新的数字再将其判断是否为质数。

一个小坑:任意数字的首位不得为0,代码里特判一下就好。

想到这,思路就很清晰了,大概是一个筛质数+拆分数字+组合数字,因为题目要求是最小次数,所以就bfs直接搜索就行。

贴上代码:

  #include <cstring>
  #include <queue>
  #include <string>
  #include <iostream>
  #include <map>
  const int N = 100005;
  int not_prime[N], a[10], vis[N], step[N];
  
  void get_prime() {//质数筛
  not_prime[0] = 1;
  not_prime[1] = 1;
  for (int i = 2; i < N; i++) {
    if (!not_prime[i]) {
    for (int j = 2 * i; j < N; j += i) {
      not_prime[j] = true;
      }
    }
  }
}

  void solve() {
  memset(vis, 0, sizeof vis);
  memset(vis, 0, sizeof vis);
  memset(step, 0, sizeof step);
  std::queue<int> q;
  int s, t; // 起始数字和目标数字
  std::cin >> s >> t;
  q.push(s);
  vis[s] = 1;
  while (!q.empty()) {//正常bfs队列
  int f = q.front();
  q.pop();
  if (f == t) {
  break;
  }
  int tf = f;
  for (int i = 3; i >= 0; i--) { // 为了把数字f拆分成数位
  // 1123
  // a[0] = 1, a[1] = 1, a[2] = 2, a[3] = 3;
  a[i] = f % 10;
  f /= 10;
  }
  f = tf;
  for (int i = 0; i < 4; i++) { // 枚举每一个数位,a[0], a[1], a[2], a[3]
  int backup = a[i]; // 记录一下原来a[i]是什么数字
  for (int j = 0; j < 10; j++) { // 枚举把a[i]这个数位变成什么数字
  a[i] = j; // 把第i位变成j
  int tt = 0; // 把第i位变成j之后,这个数字是什么
  for (int k = 0; k < 4; k++) {
  tt = tt * 10 + a[k];//重新组合
  }
  if (tt >= 1000 && !not_prime[tt] && !vis[tt]) {
    // 首位是不是0,tt是不是质数,tt之前有没有被访问过
    step[tt] = step[f] + 1;
    // step[tt] 表示从起始数字s到数字tt需要几步变换
    vis[tt] = 1;
    q.push(tt);
      }
  }
  a[i] = backup; // 把a[i]原来的数字恢复回去
  }
}
  if (!vis[t]) std::cout << "Impossible" << '\n';
  else std::cout << step[t] << '\n';
 }

  int main() {
  // freopen("in.txt", "r", stdin);
  get_prime();
  int T;
  std::cin >> T;
  while (T--) {
  solve();//直接写在solve里方便整理,不会那么的乱
  }
  return 0;
 }

标签:prime,专题,数字,int,tt,vis,step,搜索,0623
From: https://www.cnblogs.com/yr-zj/p/17523024.html

相关文章

  • 分治专题
    在牛子老师的博客下边看到yspm给了CF1019E。看了一眼,不会。看了题解,我超边分治+闵可夫斯基和,一个都不会。乐。还有20天,还能补多少坑呢,不好说。仍然是每天高压作业。但是出乎意料的晚上不是很失眠,虽然说醒了以后还是很困。现象:让大象出现的事物或者方法。大象是一种体量......
  • 最强优化指令大全 | 【Linux技术专题】「系统性能调优实战」终极关注应用系统性能调优
    Linux命令相关查看指标CPU指标vmstat指令vmstat-nm该命令用于每隔n秒采集系统的性能统计信息,共采集m次。[root@svr01]$vmstat13procs-----------memory-------------swap-------io------system-------cpu-----rbswpdfreebuffcachesiso......
  • 【杂题乱写】6 月多校分治专题训练
    AGym-101471DMoneyfornothing就是求\((d_j-c_i)(q_j-p_i)\)的最大值。可以看作点对\((d_j,q_j)\)与\((c_i,p_i)\)在二维平面上构成矩形的最大值,且\(c_i\ged_j,p_i\geq_j\)。把卖家点对放在序列\(a\),买家点对放在序列\(b\),先删去一定不优的点,删完之后\(a,b\)都......
  • 【杂题乱写】6 月多校分治专题训练
    AGym-101471DMoneyfornothing就是求\((d_j-c_i)(q_j-p_i)\)的最大值。可以看作点对\((d_j,q_j)\)与\((c_i,p_i)\)在二维平面上构成矩形的最大值,且\(c_i\ged_j,p_i\geq_j\)。把卖家点对放在序列\(a\),买家点对放在序列\(b\),先删去一定不优的点,删完之后\(a,b\)都......
  • 【杂题乱写】6 月多校分治专题训练
    AGym-101471DMoneyfornothing就是求\((d_j-c_i)(q_j-p_i)\)的最大值。可以看作点对\((d_j,q_j)\)与\((c_i,p_i)\)在二维平面上构成矩形的最大值,且\(c_i\ged_j,p_i\geq_j\)。把卖家点对放在序列\(a\),买家点对放在序列\(b\),先删去一定不优的点,删完之后\(a,b\)都......
  • 【深入了解系统性能优化】「实战技术专题」全方面带你透彻探索服务优化技术方案(系统服
    调优意义系统运行缓慢,执行速度较差虽然没有对用户或公司造成实质性的损失,但它从侧面反映出系统在某些方面存在问题。可能需要对系统参数进行优化,或者对系统的设计和交互进行调整,这是后续系统性能优化的一个重要过程。我们将继续努力优化系统,以确保其高效运行和良好性能,以提升用户体......
  • 【深入了解系统性能优化】「实战技术专题」全方面带你透彻探索服务优化技术方案(系统服
    @目录调优意义计划分析流程相关分析优化分析Nginx请求服务日志将请求热度最高的接口进行优化异步调用优化方式注意要点分析调用链路追踪体系建立切面操作分析性能和数据统计存储相关的调用以及耗时信息分析信息以及相关的耗时损耗日志系统的升级和优化异步日志处理机制异常问题和......
  • 【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RP
    RPC是什么RPC(RemoteProcedureCall,远程过程调用)是一种计算机通信协议,它允许一个程序调用另一个程序所在的远程计算机上的子程序(或函数)而不需要自己的代码去处理远程调用的细节。RPC的应用RPC技术应用广泛,特别是在分布式系统中。比如,在Web开发中,有时需要从后端服务器请求数据,此时......
  • [刷题记录Day1]Leetcode列表专题
    No.1题目二分查找思路要素:原数组升序排列清楚地定义左右边界优化空间:数组有序,通过第0元素和最后元素,可以避免查找不在数组范围内的target代码publicstaticintsearch(int[]nums,inttarget){//避免target小于nums[0],大于nums[nums.length-1]时参与运算......
  • 使用uni.app 里面 uni.chooseLocation api 打开地图位置 踩坑 踩坑 地图搜索 和列
    用 Android基座可以正常使用真机调试也可以用就是打包的时候打包完毕弹出地图之后搜索一直转圈  地图列表没有东西也是一直转圈里面有好多踩坑点  太狗了  要打包的 包名  和 dcloud里面的包名 和如果用高德地图里面的  packagename三......