题目大意:

给你两个四位数a,b。每次可以给a的一位更换一个数,要求更换之后得到的数必须是质数,问你最少几次更换,就可以使得a变成b。测试数据100组。

#include<iostream>
#include<queue>
#include<string.h>
#include<math.h>
#include<stdio.h>
#define N 10000
using namespace std;
struct number
{
	int num;
	int a[4];
};
int n;
bool vis[N]={0};
int dis[N]={0};
queue<number>q;

bool is_prime(int x)
{
	if(x==0)return 0;
	for(int i=2;i<=sqrt(x);i++)
	{
		if(x%i==0)return 0;
	}
	return 1;
}


void bfs(int s,int e)
{
	
	number t;
	t.num=s;
	for(int i=0;i<4;i++)
	{
		t.a[i]=s%10;
		s=s/10;
	}
	vis[t.num]=1;
	q.push(t);
	int flag=0;
	while(!q.empty())
	{
		for(int i=0;i<4;i++)//扩展 
		{
			for(int j=0;j<=9;j++)
			{
				number l;
				l=q.front();
				l.a[i]=j;
				l.num=l.a[0]+l.a[1]*10+l.a[2]*100+l.a[3]*1000;
				if(vis[l.num]==1)continue;
				if(l.num<1000)continue;
				if(!is_prime(l.num))continue;
				dis[l.num]=dis[q.front().num]+1;
				//cout<<l.a[3]<<l.a[2]<<l.a[1]<<l.a[0]<<"  "<<dis[l.num]<<endl;
				if(l.num==e)
				{
					flag=1;break;
				}
				vis[l.num]=1;
				q.push(l);
			}
			if(flag==1)break;
		}
		if(flag==1)break;
		q.pop();
	}
}

int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int s,e;
		scanf("%d %d",&s,&e);
		bfs(s,e);
		printf("%d\n",dis[e]);
		memset(vis,0,sizeof(vis));
		memset(dis,0,sizeof(dis));
		while(!q.empty())
		{
			q.pop();
		}
	}
	
}

有一个要求是,这些数没有前导零,我一直没读懂,然后样例过不去想了半天才知道是说,这些四位数都是四位数,既必须大于等于1000。