您的位置:首页 > 其它

[kuangbin带你飞]专题一 简单搜索 F POJ3126

2016-09-17 19:50 316 查看
题目地址:https://vjudge.net/contest/65959#problem/F

思路:bfs,对每个数分别枚举他的个十百千位,然后判断是否出现过以及是否为质数。

AC代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
bool vis[10005];
int T;

struct point{
int a,b;
};

bool prime(int x)
{
for(int i=2;i<=sqrt(x);i++)
{
if(x%i==0)
return false;
}
return true;
}

int main()
{
scanf("%d",&T);
while(T--)
{
memset(vis,false,sizeof(vis));
int s,e;
scanf("%d%d",&s,&e);
queue<point>q;
vis[s]=true;
q.push(point{s,0});
int k=1;
while(!q.empty())
{
int temp=q.front().a;
int temp2=q.front().b;
q.pop();
if(temp==e)
{
printf("%d\n",temp2);
k=0;
break;
}
int a=temp%10;//个位
int b=temp/10%10;//十位
int c=temp/100%10;//百味
int d=temp/1000;//千位
for(int i=1;i<=9;i+=2)
{
int now=d*1000+c*100+b*10+i;
if(prime(now) && !vis[now])
{
q.push(point{now,temp2+1});
vis[now]=true;
}

}
for(int i=0;i<=9;i++)
{
int now=d*1000+c*100+i*10+a;
if(prime(now) && !vis[now] )
{
q.push(point{now,temp2+1});
vis[now]=true;
}

}
for(int i=0;i<=9;i++)
{
int now=d*1000+i*100+b*10+a;
if(prime(now) && !vis[now] )
{
q.push(point{now,temp2+1});
vis[now]=true;
}
}
for(int i=1;i<=9;i++)
{
int now=i*1000+c*100+b*10+a;
if(prime(now) && !vis[now] )
{
q.push(point{now,temp2+1});
vis[now]=true;
}
}
}
if(k)
printf("Impossible\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: