UVA12101 Prime Path

Prime Path

\(link\)

题面翻译

给你个整数 \(T(T\leq 100)\),接下来 \(T\) 行数据。

每次给你俩数 \(a,b\)(保证都是四位数且都为无前导零的质数),问 \(a\) 经过几次变换可以变成 \(b\)。输出最少可以经过几次变换变成 \(b\) 的次数。如果变不成直接输出 Impossible

规定 \(a\) 可以变成 \(c\) 当且仅当 \(a,c\) 都为质数,且只改变 \(a\) 其中的一位。

例如:\(1033\to8179\),有一种方法是:\(1033\to1733\to3733\to3739\to3779\to8779\to8179\),最少变换了 \(6\) 次。

题目描述

PDF

输入格式

输出格式

样例 #1

样例输入 #1

3
1033 8179
1373 8017
1033 1033

样例输出 #1

6
7
0

思路

由题意,可得题目大致分为两部分:质数筛和BFS.

然后就套模版就行了,一个比较水的BFS模版题。

代码实现

#include<bits/stdc++.h>
using namespace std;

vector<int> p;
bool not_prime[10005];

bool v[10002];
int ans=0;
int n,m;
int k[5];
void pri(int k)
{
	for(int i=2;i<=k;i++)
	{
		if(!not_prime[i])
		{
			p.push_back(i);
		}
		for(int _pri:p)
		{
			if(i*_pri>k) break;
			not_prime[i*_pri]=true;
			if(i%_pri==0) break;
		}
	}
}
void into(int x)
{
	memset(k,0,sizeof(k));
	k[1]=x/1000;
	k[2]=x/100%10;
	k[3]=x/10%10;
	k[4]=x%10;
}
int outto()
{
	return k[1]*1000+k[2]*100+k[3]*10+k[4];
}
void bfs()
{
	memset(v,false,sizeof(v));
	queue<pair<int,int>> q;
	pair<int,int> p;
	p.first=n,p.second=0;
	q.push(p);
	v[n]=true;
	while(!q.empty())
	{
		int x=q.front().first,y=q.front().second;
		q.pop();
		
		if(x==m)
		{
			cout<<y<<endl;
			return ;
		}
		
		into(x);
		for(int i=1;i<=4;i++)
		{
			for(int j=0;j<=9;j++)
			{
				if(i==1&&j==0)
				{
					continue;
				}
				int t=k[i];
				k[i]=j;
				pair<int,int> _new;
				_new.first=outto();
				_new.second=y+1;
				if(!v[_new.first]&&!not_prime[_new.first])
				{
					v[_new.first]=true;
					q.push(_new);
				}
				k[i]=t;
			}
		}
	}
	cout<<"Impossible."<<endl;
}
int main()
{
	ios::sync_with_stdio(false);
	memset(not_prime,0,sizeof(not_prime));
	pri(10000);
	int t;
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		bfs();
	}
	return 0;
}

posted @ 2024-03-10 15:53  j1hx  阅读(32)  评论(0)    收藏  举报