POJ-3126

标题POJ-3126

首先筛选出1000到9999的质数,然后循环四位,判断是否为质数,是质数就入栈,最终找到ed
// An highlighted block
#include<iostream>
#include<queue>
#include<algorithm>
#include<string>
#include<vector>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int st, ed;
bool iszhshu[10000];
bool vis[10000];
bool jud(int ans)//暴力判断质数
{
	int t = pow(ans, 0.5);
	for (int i = 2; i <= t; i++)
	{
		if (ans % i == 0)return false;
	}
	return true;
}
void get_zhishu()//先把四位数的质数标记
{
	for (int i =1000; i <= 9999; i++)
	{
		if (jud(i)){iszhshu[i] = 1;}
	}
}
int matoi(char* p)//自己写字符串转整形
{
	int sum = 0;for (int i = 0; i <= 3; i++)sum = sum * 10 + p[i] - '0';
	return sum;
}
void  mitoa(char* p, int n)//自己写整形转字符串
{
	for (int i = 3; i >= 0; i--){p[i] = n % 10+'0';	n /= 10;}
}
int bfs()
{
	queue<int>Q;
	int cnt = 0;
	Q.push(st);
	vis[st] = 1;
	while (!Q.empty())
	{
		int size = Q.size();
		for (int k = 0; k < size; k++)
       {
			int t = Q.front(); Q.pop();
			if (t == ed)return cnt;
			char p[4];
			for (int i = 0; i < 4; i++)//循环四位
			{
				int j=0;
				if (i == 0)j = 1;//第一位不能取0
				for (; j <= 9; j++)
				{
					mitoa(p, t);//置为初始值
					p[i] = j + '0';
					int s = matoi(p);//改变一个位置的值
					if (iszhshu[s] && !vis[s])//如果是质数且没被访问过
					{
						vis[s] = 1;
						Q.push(s);
					}
				}
			}
		}
		cnt++;
	}
	return -1;
}
int main()
{
	get_zhishu();
	int T;
	cin >> T;
	for (int i = 0; i < T; i++)
	{
		memset(vis, 0, 10000);
		cin >> st >> ed;
		int cnt = bfs();
		if (cnt == -1)printf("Impossible\n");
		else printf("%d\n", cnt);
	}
	return 0;
}```
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值