首页 > 其他分享 >POJ 3126 Prime Path

POJ 3126 Prime Path

时间:2024-07-09 16:08:42浏览次数:8  
标签:Prime 数字 int 3126 vis 素数 POJ include

题目链接:POJ 3126 【Prime Path】



思路

       由于最多有100组样例,所以直接先初始化判断出1000-9999之间的数字是否是素数。然后再对每个题目所给的四位数进行BFS搜索,依次对每个数位进行枚举,使用0-9的每一个数字对每一个数位进行替换,注意千位上的数字不能为0。然后检验当前数字是否为素数和是否在当前这组样例中使用过,使用过或者不是素数则continue,否则加入队列中继续循环,直到找出和y一样的数字为止。由于当前代码判断的都是修改后的数字是否等于y,所以需要特判x=y的情况。


代码

#include <iostream>
#include<algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N = 1e5 + 10;

int x, y;
// 初始化判断是否是素数,记录是否被使用
bool isprime[N], vis[N];
void init() {
  for (int i = 1000; i <= 9999; i++) {
    isprime[i] = true;
    for (int j = 2; j <= i / j; j++) {
      if (i % j == 0) {
        isprime[i] = false;
        break;
      }
    }
  }
}

void bfs(int x) {
  queue<pair<int, int> > q;
  q.push({x, 0});
  vis[x] = true;

  while (!q.empty()) {
    pair<int, int> xx = q.front();
    q.pop();
    int mod = 1;
    for (int i = 1; i <= 4; i++) {
      mod *= 10;
      // 计算出余数,依次枚举当前位的可以取的值
      int record = xx.first % mod;
      for (int j = 0; j <= 9; j++) {
        if (i == 4 && j == 0)
          continue;
        int dx = xx.first - record + j * mod / 10 + record % (mod / 10);
        if (isprime[dx] == true && vis[dx] == false) {
          if (dx == y) {
            cout << xx.second + 1 << endl;
            return;
          }
          vis[dx] = true;
          q.push({dx, xx.second + 1});
        }
      }
    }
  }
  return;
}

int main() {
  init();

  int t;
  cin >> t;
  while (t--) {
    memset(vis, 0, sizeof vis);
    cin >> x >> y;
    if (x == y)
      cout << 0 << endl;
    else
      bfs(x);
  } 
  return 0;
}

标签:Prime,数字,int,3126,vis,素数,POJ,include
From: https://www.cnblogs.com/againss/p/18292163

相关文章

  • 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
    在现代软件架构中,不同类型的类扮演着不同的角色,共同构成了一个清晰、模块化和可维护的系统。以下是对实体类(Entity)、数据传输对象(DTO)、领域对象(DomainObject)、持久化对象(PersistentObject)、业务对象(BusinessObject)、应用对象(ApplicationObject)、数据访问对象(DataAcces......
  • POJ 3278 Catch That Cow
    题目链接:POJ3278【atchThatCow】思路    将起点放入队列,然后一次取出队列中的元素,对其进行左右移动和乘2的移动,并判断移动后的位置是否合法,合法则放入队列中继续操作。每次取出队列中的元素后,通过假设剩下的步骤全部是左右移动一格来更新结果。代码#include<io......
  • c++ primer plus 第15章友,异常和其他:异常,15.3.5 异常规范和 C++11
    c++primerplus第15章友,异常和其他:异常,15.3.5异常规范和C++1115.3.5异常规范和C++11文章目录c++primerplus第15章友,异常和其他:异常,15.3.5异常规范和C++1115.3.5异常规范和C++1115.3.5异常规范和C++11有时候,一种理念看似有前途,但实际的使用效果并......
  • c++ primer plus 第15章友,异常和其他:15.3.1 调用abort()02
    c++primerplus第15章友,异常和其他:15.3.1调用abort()02调用abort()02文章目录c++primerplus第15章友,异常和其他:15.3.1调用abort()0215.3.1调用abort()15.3.1调用abort()对于这种问题,处理方式之一是,如果其中一个参数是另一个参数的负值,则调用abort(......
  • c++ primer plus 第15章友,异常和其他:异常,15.3.3 异常机制
    #c++primerplus第15章友,异常和其他:异常,15.3.3异常机制异常,15.3.3异常机制文章目录15.3.3异常机制15.3.3异常机制程序清单15.9error3.cpp程序清单15.10excmean.h程序清单15.11error4.cpp15.3.3异常机制15.3.3异常机制下面介绍如何使用异常机制来处......
  • C primer plus Chapter2
    ASimpleExampleofC#include<stdio.h>intmain(void)/*asimpleprogram*/{intnum;/*defineavariablecallednum*/num=1;/*assignavaluetonum*/printf("Iamasimple");/*usetheprintf()function*/printf("......
  • POJ3017 Cut the Sequence
    POJ3017CuttheSequence题目大意给定一个一个长度为\(N\)的序列\(A\),要求把该序列划分成若干段,其中每一段中的数的和不大于\(M\),现在需要使得每一段中数的最大值的和最小,求该最小值。\[0\leqn\leq10^5\\0\leqm\leq10^{11}\\0\leqa_i\leq10^6\]解题思路......
  • 《C++ Primer》导学系列:第 17 章 - 标准库特殊设施
    17.1tuple类型C++11引入的tuple类型是一个可以包含多个不同类型元素的固定大小容器。tuple类似于pair,但其可以容纳多个元素,不限于两个。这使得tuple非常适合用来返回多个值的函数或者需要存储异构数据的场景。17.1.1定义和初始化tuple定义和初始化tuple非常简单,可以使用st......
  • c++ primer plus 第15章友,异常和其他:15.1.2 友元成员函数
    #c++primerplus第15章友,异常和其他:15.1.2友元成员函数提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:15.1.2友元成员函数提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言15.1.2友元成员函数程序清单15.4tvfm......
  • c++ primer plus 第15章友,异常和其他:15.1.3 其他友元关系
    c++primerplus第15章友,异常和其他:15.1.3其他友元关系提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加15.1.3其他友元关系提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录c++primerplus第15章友,异常和其他:15.1.3其他......