http://poj.org/problem?

id=3126

题目大意:

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

思路:

首先求出全部4位素数。

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

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

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<queue>
  4. #include<algorithm>
  5. using namespace std;
  6. const int MAXN=10000+10;
  7. const int INF=0x3ffffff;
  8. bool isprimer[MAXN];
  9. int primer[MAXN],num;
  10. int head[MAXN],len;
  11. struct edge
  12. {
  13. int to,next;
  14. }e[MAXN*10];
  15. void add(int from,int to)
  16. {
  17. e[len].to=to;
  18. e[len].next=head[from];
  19. head[from]=len++;
  20. }
  21. //推断两个数仅有一个数字不同
  22. bool judge(char *x,char *y)
  23. {
  24. int cnt=0;
  25. for(int i=0;i<4;i++)
  26. if(x[i]==y[i])
  27. cnt++;
  28. return cnt==3;
  29. }
  30. int dis[MAXN];
  31. bool vis[MAXN];
  32. int spfa(int s,int t)
  33. {
  34. for(int i=1000;i<=10000;i++)
  35. {
  36. dis[i]=INF;
  37. vis[i]=0;
  38. }
  39. dis[s]=0;
  40. vis[s]=true;
  41. queue<int> q;
  42. q.push(s);
  43. while(!q.empty())
  44. {
  45. int cur=q.front();
  46. q.pop();
  47. for(int i=head[cur];i!=-1;i=e[i].next)
  48. {
  49. int to=e[i].to;
  50. if(dis[cur]+ 1 < dis[to])
  51. {
  52. dis[to]=dis[cur]+1;
  53. if(!vis[to])
  54. q.push(to);
  55. }
  56. }
  57. }
  58. return dis[t];
  59. }
  60.  
  61. int main()
  62. {
  63. memset(head,-1,sizeof(head));
  64. num=len=0;
  65.  
  66. for(int i=2;i*i<MAXN;i++)
  67. {
  68. if(!isprimer[i])
  69. for(int j=i;j*i<MAXN;j++)
  70. isprimer[i*j]=true;
  71. }
  72.  
  73. for(int i=1000;i<10000;i++)
  74. if(!isprimer[i])
  75. primer[num++]=i;
  76.  
  77. //printf("%d\n",num);
  78. char cur[5],temp[5];
  79. for(int i=0;i<num;i++)
  80. {
  81. sprintf(cur,"%d",primer[i]);
  82.  
  83. // printf("%s\n",cur);
  84. for(int j=i+1;j<num;j++)
  85. {
  86. sprintf(temp,"%d",primer[j]);
  87.  
  88. if(judge(cur,temp))
  89. {
  90. add(primer[j],primer[i]);
  91. add(primer[i],primer[j]);
  92. }
  93. }
  94. }
  95.  
  96. int T;
  97. scanf("%d",&T);
  98. while(T--)
  99. {
  100. int a,b;
  101. scanf("%d%d",&a,&b);
  102. if(isprimer[b])
  103. {
  104. printf("Impossible\n");
  105. continue;
  106. }
  107. int ans=spfa(a,b);
  108. if(ans==INF)
  109. printf("Impossible\n");
  110. else
  111. printf("%d\n",ans);
  112. }
  113. return 0;
  114. }

POJ 3126 Prime Path SPFA的更多相关文章

  1. 双向广搜 POJ 3126 Prime Path

      POJ 3126  Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16204   Accepted ...

  2. POJ 3126 Prime Path(素数路径)

    POJ 3126 Prime Path(素数路径) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 The minister ...

  3. BFS POJ 3126 Prime Path

    题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...

  4. poj 3126 Prime Path bfs

    题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  5. POJ - 3126 - Prime Path(BFS)

    Prime Path POJ - 3126 题意: 给出两个四位素数 a , b.然后从a开始,每次可以改变四位中的一位数字,变成 c,c 可以接着变,直到变成b为止.要求 c 必须是素数.求变换次数 ...

  6. POJ 3126 Prime Path(BFS 数字处理)

    意甲冠军  给你两个4位质数a, b  每次你可以改变a个位数,但仍然需要素数的变化  乞讨a有多少次的能力,至少修改成b 基础的bfs  注意数的处理即可了  出队一个数  然后入队全部能够由这个素 ...

  7. (简单) POJ 3126 Prime Path,BFS。

    Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...

  8. poj 3126 Prime Path(搜索专题)

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20237   Accepted: 11282 Desc ...

  9. POJ 3126 Prime Path【从一个素数变为另一个素数的最少步数/BFS】

    Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26475 Accepted: 14555 Descript ...

随机推荐

  1. 分别使用Hadoop和Spark实现TopN(1)——唯一键

    0.简介 TopN算法是一个经典的算法,由于每个map都只是实现了本地的TopN算法,而假设map有M个,在归约的阶段只有M x N个,这个结果是可以接受的并不会造成性能瓶颈. 这个TopN算法在ma ...

  2. windbg将调试信息保存到文本文件

    在跟踪一些出现频率较低的问题时,有时候需要长时间调试,但是在在输出信息太多时可能前面的日志会被清空,为避免这种情况,可以将输出日志记录到文本文件以备查看. 1. 可以在启动时直接用带 -logo的命令 ...

  3. 联想VIBE Shot(Z90-7/全网通) 解锁BootLoader

    工具下载链接: http://pan.baidu.com/s/1dF7zGTb 备用下载链接: http://pan.baidu.com/s/1i4UHP4L 本篇教程教你如何傻瓜式解锁BootLoa ...

  4. NetCore下获取项目文件路径

    我要获取的是doc/FPFile.xml 百度了一大堆就是找不到解决问题. 把属性更改为始终赋值, XmlDocument xdi = new XmlDocument(); xdi.Load((&qu ...

  5. CDC之Synchronizers

    1 Scenarios Two scenarios for passing signals across CDC boundaries: 1) sometimes it's not necessary ...

  6. ROS: Ubuntu16.04安装ROS-kinetic

    参考连接:SLAM: Ubuntu14.04_Kylin安装ROS-Indigo第一步: 软件源配置 1. 增加下载源(增加ubuntu版的ros数据仓库,即下载源)(通用指令适合任何版本的ros) ...

  7. 大型工程多个目录下的Makefile写法

    1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Ma ...

  8. windows10上安装mysql详细图文教程

    在windows10上安装mysql详细图文教程   这篇文章主要介绍了在windows10上安装mysql详细图文教程,本文介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧 环境:windw ...

  9. eas之打开窗体

    UIContext uiContext=new UIContext(this);IUIWindow uiWindow=UIFactory.createUIFactory(UIFactoryName.E ...

  10. eas之获得任何一个KDTable的选中行

    import com.kingdee.bos.ctrl.kdf.table.util.KDTableUtil; int[] selectRows =KDTableUtil.getSelectedRow ...