Prime Path POJ - 3126 搜索

本文介绍了一个基于BFS算法解决特定数字变换问题的方法。通过广度优先搜索策略,尝试改变数字的每一位来寻找从一个数字到另一个数字的最短路径。需要注意的是高位不能变为0,并且避免重复搜索已出现的数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解

BFS按照题意进行搜索,尝试改变每一位数字,改变为0~9的数值,出现的数字不在入队,注意最高位数字不能为0。

AC代码

#include <stdio.h>
#include <iostream>
#include <queue>
#define fst first
#define sed second
using namespace std;
typedef long long ll;

const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int N = 1e4;
bool pri[N], vis[N];

int BFS(int a, int b)
{
	memset(vis, 0, sizeof(vis));
	queue<pair<int, int>> q;
	q.push(make_pair(a, 0 ));
	int arr[10];
	while (!q.empty())
	{
		int t = q.front().fst, p = q.front().sed + 1;
		q.pop();
		for (int k = 0; k < 4; ++k)
			arr[k] = t % 10, t /= 10;
		for (int i = 0; i < 4; ++i) //位
			for (int j = i == 3; j < 10; ++j) //数
			{
				int c = 0;
				for (int k = 3; k >= 0; --k)
				{
					c *= 10;
					c += k == i ? j : arr[k];
				}
				if (c == b)
					return p;
				if (pri[c] || vis[c])
					continue;
				vis[c] = 1;
				q.push(make_pair(c, p));
			}
	}
	return -1;
}
int main()
{
#ifdef LOCAL
	freopen("C:/input.txt", "r", stdin);
#endif
	for (int i = 2; i < N; ++i)
		if (!pri[i])
			for (int j = i + i; j < N; j += i)
				pri[j] = 1;
	int T;
	cin >> T;
	while (T--)
	{
		int a, b;
		cin >> a >> b;
		if (a == b)
		{
			cout << 0 << endl;
			continue;
		}
		int res = BFS(a, b);
		if (~res)
			cout << res << endl;
		else
			cout << "Impossible" << endl;
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值