http://poj.org/problem?

id=3126

题目大意:

给你两个四位的素数s和t,要求每次改变一个数字。使得改变后的数字也为素数,求s变化到t的最少变化次数。

思路:

首先求出全部4位素数。

对于两个素数之间,假设仅仅相差一个数字,那么就建立图。(双向)

最后求最短路就可以(能够SPFA也能够BFS)

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=10000+10;
const int INF=0x3ffffff;
bool isprimer[MAXN];
int primer[MAXN],num;
int head[MAXN],len;
struct edge
{
int to,next;
}e[MAXN*10];
void add(int from,int to)
{
e[len].to=to;
e[len].next=head[from];
head[from]=len++;
}
//推断两个数仅有一个数字不同
bool judge(char *x,char *y)
{
int cnt=0;
for(int i=0;i<4;i++)
if(x[i]==y[i])
cnt++;
return cnt==3;
}
int dis[MAXN];
bool vis[MAXN];
int spfa(int s,int t)
{
for(int i=1000;i<=10000;i++)
{
dis[i]=INF;
vis[i]=0;
}
dis[s]=0;
vis[s]=true;
queue<int> q;
q.push(s);
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int i=head[cur];i!=-1;i=e[i].next)
{
int to=e[i].to;
if(dis[cur]+ 1 < dis[to])
{
dis[to]=dis[cur]+1;
if(!vis[to])
q.push(to);
}
}
}
return dis[t];
} int main()
{
memset(head,-1,sizeof(head));
num=len=0; for(int i=2;i*i<MAXN;i++)
{
if(!isprimer[i])
for(int j=i;j*i<MAXN;j++)
isprimer[i*j]=true;
} for(int i=1000;i<10000;i++)
if(!isprimer[i])
primer[num++]=i; //printf("%d\n",num);
char cur[5],temp[5];
for(int i=0;i<num;i++)
{
sprintf(cur,"%d",primer[i]); // printf("%s\n",cur);
for(int j=i+1;j<num;j++)
{
sprintf(temp,"%d",primer[j]); if(judge(cur,temp))
{
add(primer[j],primer[i]);
add(primer[i],primer[j]);
}
}
} int T;
scanf("%d",&T);
while(T--)
{
int a,b;
scanf("%d%d",&a,&b);
if(isprimer[b])
{
printf("Impossible\n");
continue;
}
int ans=spfa(a,b);
if(ans==INF)
printf("Impossible\n");
else
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. IOS RunLoop 常驻线程的实现
  2. HTML5锚点请用id代替name
  3. (6)java的内存泄露问题
  4. 站点发布到 IIS 后,System.Data.SqlLite.dll 末找到
  5. ActiveX添加测试工程, 出现的问题[非选择性参数][找不到成员]
  6. 世纪大争论:Linux还是GNU/Linux?
  7. Sql server 开窗函数over()的语法
  8. 在linux服务器上发布web应用的完整过程
  9. Java课后练习
  10. Android中自定义IP控件
  11. docker17.03.2安装
  12. Azure系列2.1.15 —— SharedAccessBlobPolicy
  13. HTTP常用头部信息
  14. android 知识汇总
  15. TDateTimePicker 选择最小日期时异常处理
  16. android 获取view在屏幕中的位置
  17. Python关于PIL库的学习总结与成果展示
  18. ThinkPHP导入第三方类库Vendor
  19. JavaScript身份证号码有效性验证
  20. 18 Tar Command Examples in Linux

热门文章

  1. # --with-http_stub_status_module模块
  2. windows phone控件
  3. 1.0 windows10系统安装步骤(1)
  4. JavaScript变量提升及作用域
  5. 【SQL】数值型函数
  6. IIS日志分析:SC-Status语义
  7. Redis 之string结构及命令详解
  8. webstorm前端开发工具vue环境配置及运行项目
  9. Scala语言学习笔记——方法、函数及异常
  10. 基于日志实现ssh服务防护脚本