POJ 3126 Prime Path
来源:互联网 发布:免费的电子书软件 编辑:程序博客网 时间:2024/05/29 12:06
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define INF 0x3f3f3f3f
struct abcd
{
int p;
int step;
}s[50000];
int prime[10005];
int num[5];
int a[10005];
int n,m;
int ans=-1;
void init()
{
int i,j;
memset(prime,0,sizeof(prime));
prime[0]=prime[1]=1;
for(i=2;i<=105;i++)
for(j=i+i;j<10005;j+=i)
prime[j]=1;
}
void cal(int ab)
{
int i;
memset(num,0,sizeof(num));
for(i=0;i<4;i++)
{
num[i]=ab%10;
ab/=10;
}
num[1]*=10;
num[2]*=100;
num[3]*=1000;
//printf("%d %d ",num[0],num[1]);
}
void bfs()
{
int i,j,k;
int x;
k=1;
s[0].p=n;
s[0].step=0;
memset(a,0,sizeof(a));
a[n]=1;
for(i=0;i<k&&i<50000;i++)
{
cal(s[i].p);
for(j=0;j<=9;j++)
{
x=j+num[1]+num[2]+num[3];
if(prime[x]==0&&a[x]==0)
{
s[k].p=x;
s[k].step=s[i].step+1;
a[x]=1;
if(x==m)
{
ans=s[k].step;
return;
}
k++;
}
}
for(j=0;j<=9;j++)
{
x=num[0]+10*j+num[2]+num[3];
if(prime[x]==0&&a[x]==0)
{
s[k].p=x;
s[k].step=s[i].step+1;
a[x]=1;
if(x==m)
{
ans=s[k].step;
return;
}
k++;
}
}
for(j=0;j<=9;j++)
{
x=num[0]+num[1]+100*j+num[3];
if(prime[x]==0&&a[x]==0)
{
s[k].p=x;
s[k].step=s[i].step+1;
a[x]=1;
if(x==m)
{
ans=s[k].step;
return;
}
k++;
}
}
for(j=1;j<=9;j++)
{
x=num[0]+num[1]+num[2]+1000*j;
if(prime[x]==0&&a[x]==0)
{
s[k].p=x;
s[k].step=s[i].step+1;
a[x]=1;
if(x==m)
{
ans=s[k].step;
return;
}
k++;
}
}
}
}
int main()
{
int t;
init();
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(m==n)
{
printf("0\n");
continue;
}
ans=-1;
cal(n);
bfs();
if(ans==-1)
printf("Impossible\n");
else
printf("%d\n",ans);
}
return 0;
}
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define INF 0x3f3f3f3f
struct abcd
{
int p;
int step;
}s[50000];
int prime[10005];
int num[5];
int a[10005];
int n,m;
int ans=-1;
void init()
{
int i,j;
memset(prime,0,sizeof(prime));
prime[0]=prime[1]=1;
for(i=2;i<=105;i++)
for(j=i+i;j<10005;j+=i)
prime[j]=1;
}
void cal(int ab)
{
int i;
memset(num,0,sizeof(num));
for(i=0;i<4;i++)
{
num[i]=ab%10;
ab/=10;
}
num[1]*=10;
num[2]*=100;
num[3]*=1000;
//printf("%d %d ",num[0],num[1]);
}
void bfs()
{
int i,j,k;
int x;
k=1;
s[0].p=n;
s[0].step=0;
memset(a,0,sizeof(a));
a[n]=1;
for(i=0;i<k&&i<50000;i++)
{
cal(s[i].p);
for(j=0;j<=9;j++)
{
x=j+num[1]+num[2]+num[3];
if(prime[x]==0&&a[x]==0)
{
s[k].p=x;
s[k].step=s[i].step+1;
a[x]=1;
if(x==m)
{
ans=s[k].step;
return;
}
k++;
}
}
for(j=0;j<=9;j++)
{
x=num[0]+10*j+num[2]+num[3];
if(prime[x]==0&&a[x]==0)
{
s[k].p=x;
s[k].step=s[i].step+1;
a[x]=1;
if(x==m)
{
ans=s[k].step;
return;
}
k++;
}
}
for(j=0;j<=9;j++)
{
x=num[0]+num[1]+100*j+num[3];
if(prime[x]==0&&a[x]==0)
{
s[k].p=x;
s[k].step=s[i].step+1;
a[x]=1;
if(x==m)
{
ans=s[k].step;
return;
}
k++;
}
}
for(j=1;j<=9;j++)
{
x=num[0]+num[1]+num[2]+1000*j;
if(prime[x]==0&&a[x]==0)
{
s[k].p=x;
s[k].step=s[i].step+1;
a[x]=1;
if(x==m)
{
ans=s[k].step;
return;
}
k++;
}
}
}
}
int main()
{
int t;
init();
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
if(m==n)
{
printf("0\n");
continue;
}
ans=-1;
cal(n);
bfs();
if(ans==-1)
printf("Impossible\n");
else
printf("%d\n",ans);
}
return 0;
}
0 0
- POJ 3126 Prime Path
- POJ 3126 Prime Path
- poj 3126Prime Path
- POJ -3126-Prime Path
- POJ 3126 Prime Path
- poj 3126 Prime Path
- POJ 3126 - Prime Path
- POJ 3126 Prime Path
- poj 3126 prime path
- POJ 3126 Prime Path
- Prime Path poj 3126
- POJ 3126 Prime Path
- poj 3126 Prime Path
- POJ 3126 Prime Path
- poj 3126 Prime path
- poj - 3126 - Prime Path
- POJ 3126 Prime Path
- POJ 3126 Prime Path
- 第二次作业(使用linux)
- usaco光纤通信(并查集)
- 句柄类
- hdu 2104 K-th Number(静态求区间第k小+整体二分)
- 互联网产品的需求分析
- POJ 3126 Prime Path
- 【三层架构】基础总结
- Linux基本操作01
- leetcode 066 plus one
- maven
- python基础-将python作为计算器
- uva 1386
- hdu1233——还是畅通工程(最小生成树)
- 我的C++学习路线