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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话