首页 > 学院 > 开发设计 > 正文

POJ - 3126 Prime Path解题报告

2019-11-08 01:21:12
字体:
来源:转载
供稿:网友
题目大意:

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

#include<iostream>#include<queue>#include<string.h>#include<math.h>#include<stdio.h>#define N 10000using 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。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表