博客
关于我
F - Prime Path //BFS 广度优先搜索
阅读量:703 次
发布时间:2019-03-21

本文共 2344 字,大约阅读时间需要 7 分钟。

从字符串中提取整数值

首先,我们需要从字符串中提取整数值。例如,对于字符串s,可以使用sprintf函数将其转换为整数值并保存在变量n中。以下是示例代码:

#include 
using namespace std; // 例如,字符串s = "1234"可以转换为整数值n = 1234 sprintf("n", "%d", s); // 或者使用scanf函数 sscanf("n", "%d", &n);

这是一个简单的示例,展示了如何从字符串中提取整数值。这是编程中的常见操作,尤其是在处理用户输入时非常有用。在我们的程序中,我们将使用类似的方法来读取输入数据。

下方是完整的代码示例:

#include 
#include
#include
#include
#include
using namespace std; #define N 10000 int prime[N]; int s, e, vis[N]; // 检查一个数是否为质数 int Prime(int x) { for (int i = 2; i <= sqrt(x); i++) { if (x % i == 0) return 0; } return 1; } // 将数字的某一位设置为0 int change(int n, int pos) { char s[10]; sprintf(s, "%d", n); s[pos] = '0'; sscanf(s, "%d", &n); return n; } // 广度优先搜索找到从s到e的最短路径,并计算成本 int bfs(int start, int end) { memset(vis, 0, sizeof(vis)); queue
q; q.push(start); vis[start] = 1; int w = 1000; // 每一步的权重为1000的一位数(0到9) while (!q.empty()) { int u = q.front(); q.pop(); if (u == end) return vis[u] - 1; for (int i = 0; i < 4; i++) { int v = change(u, i); // 将u的第i位数字设置为0 for (int j = 0; j < 10; j++) { int next = v + j * w; if (prime[next] && !vis[next]) { q.push(next); vis[next] = vis[u] + 1; } } w /= 10; // 下一个位置的权重是当前权重的十分之一 } } return -1; // 如果无法到达 } // 主函数 int main() { // 初始化质数数组 for (int i = 1000; i < N; i++) { prime[i] = Prime(i); } // 读取输入 int T; scanf("%d", &T); for (int i = 0; i < T; i++) { int s, e; scanf("%d %d", &s, &e); // 调用广度优先搜索算法 if (bfs(s, e) == -1) { printf("Impossible\n"); } else { printf("%d\n", bfs(s, e)); } } return 0; }

编程相关内容

  • 质数检查

    我们首先需要在代码中定义一个质数数组prime,用于存储每个数是否为质数。代码中定义了一个名为Prime的函数,用于以线性时间复杂度检查一个数是否为质数。

  • 数字改变函数

    为了实现数位逐步改变的功能,我们定义了一个名为change的函数。该函数接收一个整数n和一个位置pos,然后将npos位置的数字设置为0,并重新解析这个修改后的字符串以获得新的整数值。

  • 广度优先搜索(BFS)

    主要算法部分是广度优先搜索,用于找到从初始数start到目标数end的最短路径。每次从队列中取出当前数,尝试将其每一位数字依次设置为0,生成下一个数,并检查该数是否为质数和未被访问。如果是,则将下一个数加入队列,并记录访问路径。每一步会增加一个计算成本,即为1。搜索过程中,每次从一个数到下一个数的转换涉及改变一个数位,并根据权重加上相应的计算成本。

  • 权重计算

    每条边的权重是当前数位的权重,比如从个位到十位的权重是10,而从十位到百位的权重则是100。具体来说,我们从个位开始,逐步将权重除以10,直到处理完所有的数位。

  • 主函数与输入处理

    在主函数中,我们首先初始化质数数组prime,然后读取输入数据。对于每个测试用例,我们从标准输入中读取两个四位数,分别是起点s和终点e。然后调用广度优先搜索函数bfs,找到从se的最短路径,并输出结果。如果路径不存在,则输出"Impossible"。

  • 通过上述代码,我们可以完成广度优先搜索驱动的数字逐位改变过程,从而找到两四位质数之间的最便宜路径(即计算最小的改变次数)。该算法充分利用了广度优先搜索的性质,确保找到一条最小改变次数的路径。

    转载地址:http://zioez.baihongyu.com/

    你可能感兴趣的文章
    NR,NF,FNR
    查看>>
    nrf开发笔记一开发软件
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    nullnullHuge Pages
    查看>>
    numpy 用法
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>
    oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
    查看>>