废话不多说,题目要求是给出一个数n,有n组数据,每组有两个数,变动第一个数据的个,十,百,千位,使最少的步骤
成为第二个数据;代码有些菜;
#include <iostream>
#include <queue>
#include <cmath>
#include <cstring>
using namespace std;
int visited[10000];
queue <int> vi;
int q;
int step[10000];
bool isprim(int n)//判断是否素数;
{
for (int i = 2; i <= sqrt(n*1.0); ++i)
{
if (n % i == 0)
return false;
}
return true;
}
int main()
{
int t,m,n,first,next,temp;
cin>>t;
while(t--)
{
memset(visited,0,sizeof(visited));
memset(step,0,sizeof(step));
cin>>m>>n;
vi.push(m);
step[m]=0;
visited[m]=1;
while(!vi.empty())
{
first = vi.front();
vi.pop();
// if(first == n)break;(由于多了这一条,错了很久,头疼死了)
for(int i = 0; i <= 9; i ++)//对数据变动,由1到9循环;
{
for(int j = 1; j <=4; j ++)//个十百千位分别各自变动;
{
if(j == 1 && i!= 0)
{
next = i*1000+(first -first/1000*1000);
if(isprim(next) && !visited[next])//判断千位变动是否为素数,是否出现过,如果是素数且未出现过,加入队列,标记;以下同这一样;
{
vi.push(next);
visited[next]=1;
step[next]=step[first]+1;
}
}
if(j == 2)
{
next = first/1000*1000+i*100+(first - first/100*100);
if(isprim(next) && !visited[next])
{
vi.push(next);
visited[next]=1;
step[next]=step[first]+1;
}
}
if(j ==3)
{
next = first/100*100+i*10+(first-first/10*10);
if(isprim(next) && !visited[next])
{
vi.push(next);
visited[next]=1;
step[next]=step[first]+1;
}
}
if(j == 4)
{
next = first/10*10+i;
if(isprim(next)&& !visited[next])
{
vi.push(next);
visited[next]=1;
step[next]=step[first]+1;
}
}
}
}
if(visited[n])//判断n出现时在第几步;
temp = step[n];
}
cout<<temp<<endl;
}
}