BFS得到的一定是最短路径。开始我还在纠结怎么才是最短的呢。其实BFS的题目有个共性(这不废话,哪一类题没有共性啊。呵呵)。以后做这种题自己慢慢总结吧。

这题的思路就是写枚举出4位数的所有prime number,用个数组p[]标记。再用个数组visit[]标记某个数是否被访问过,避免重复访问.然后就是对这四位数的每一位进行BFS啦!

#include <iostream>#include <cstdio>#include <queue>#include <fstream>#include <memory.h>

using namespace std;

int p[10000],visit[10000];int n,a,b;int Index[4];struct node{int num,step;}ans[10000];

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

int bfs(){int j=0,i;    queue<node> q;    ans[j].num=a;    ans[j].step=0;    visit[a]=1;    q.push(ans[j]);while(!q.empty())    {        node next;        next=q.front();        q.pop();if(next.num==b)        {return next.step;        }        Index[0]=next.num/1000; Index[1]=(next.num%1000)/100;        Index[2]=(next.num%100)/10; Index[3]=next.num%10;for(i=0 ; i<10 ;i++)        {if(i==Index[3])continue;int l=next.num+i-Index[3];if(!visit[l] && p[l])            {                ans[++j].num=l;                ans[j].step=next.step+1;                visit[l]=1;               q.push(ans[j]);            }        }for(i=0 ; i<10 ;i++)        {if(i==Index[2])continue;int l=next.num+(i-Index[2])*10;if(!visit[l] && p[l])            {                ans[++j].num=l;                ans[j].step=next.step+1;               visit[l]=1;                q.push(ans[j]);            }        }for(i=0 ; i<10 ;i++)        {if(i==Index[1])continue;int l=next.num+(i-Index[1])*100;if(!visit[l] && p[l])            {                ans[++j].num=l;                ans[j].step=next.step+1;                visit[l]=1;               q.push(ans[j]);            }        }for( i=0 ; i<10 ;i++)        {if(i==Index[0])continue;int l=next.num+(i-Index[0])*1000;if(!visit[l] && p[l])            {                ans[++j].num=l;                ans[j].step=next.step+1;                visit[l]=1;                q.push(ans[j]);            }        }

    }

}

int main(){    freopen("acm.txt","r",stdin);    memset(p,0,sizeof(p));    scanf("%d",&n);for(int i=1000; i<10000; i++)    {if(prime(i))          p[i]=1;     //is prime number    }while(n--)    {        memset(visit,0,sizeof(visit));        scanf("%d%d",&a,&b);        printf("%d\n",bfs());    }return 0;}

转载于:https://www.cnblogs.com/Jason-Damon/archive/2012/03/14/2397114.html

poj 3126 BFS相关推荐

  1. POJ - 3126 - Prime Path(BFS)

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

  2. POJ 3126 - Prime Path + Python(BFS)

    ()原题链接: # 原题:POJ 3126 - Prime Path | 眈眈探求 # 解题思路:https://blog.csdn.net/LYHVOYAGE/article/details/182 ...

  3. F - Prime Path POJ - 3126

    F - Prime Path POJ - 3126 题意修改一个四位数质数的某一位,使得该质数又变为一个质数,求从当前数变为目标质数的最少变化次数. bfs枚举每一位的每种变化 #include< ...

  4. Prime Path POJ - 3126

    题目链接:Prime Path POJ - 3126 =================================================== Prime Path Time Limit ...

  5. POJ 3126 Prime Path BFS搜索

    题意:就是找最短的四位数素数路径 分析:然后BFS随便搜一下,复杂度最多是所有的四位素数的个数 #include<cstdio> #include<algorithm> #in ...

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

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

  7. 【POJ - 3126】Prime Path(bfs)

    题干: 给你两个四位的素数a,b. a可以改变某一位上的数字变成c,但只有当c也是四位的素数时才能进行这种改变. 请你计算a最少经过多少次上述变换才能变成b. 例如:1033 -> 8179  ...

  8. POJ 3126 Prime Path 简单广搜(BFS)

    题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...

  9. POJ 3126 Prime Path(BFS + 素数打表)

    题意:给定两个四位素数, 从一个素数到另一个素数,最少用几步,可以一次更改四位中的任意一位,但每次改变都只能是素数. 解题思路:四位数每一位情况有十种情况0-9, 四位共有40种情况, 枚举40种情况 ...

最新文章

  1. Python读取文件编码及内容
  2. Spring基于注解的AOP配置
  3. wp转shp_【收藏】空间数据格式转换方法
  4. Matlab-重构和重新排列数组
  5. linux 如何让.开头的文件不隐藏_如何使用 BusyBox 制作Linux最小文件系统
  6. 如果你是IT技术人员,请思考这15个问题
  7. 使用Jenkins在Azure Web App上进行ASP.NET Core应用程序的持续集成和部署(CI/CD)–第3天
  8. tomcat编码配置gbk_tomcat编码乱码问题
  9. ajaxForm和ajaxSubmit实现form的ajax提交的方法
  10. 利用detours实现API劫持
  11. Civil3D绘制路线
  12. STM32 ADC工作原理
  13. CentOS 5和6的启动流程
  14. 论文阅读:Retrieval-augmented Generation across Heterogeneous Knowledge
  15. Nginx之URL重写
  16. 毕业设计:电子/通信/物联网/计算机专业选题目参考(嵌入式linux/单片机STM32/web/图像)
  17. 计算机无法自动排列,为什么我的电脑不能自动排列图标
  18. 第5章第27节:如何录制幻灯片的演示过程 [PowerPoint精美幻灯片实战教程]
  19. Lucene 2.2.0发布自带的HTMLParser的使用
  20. niginx参数配置详解(转)

热门文章

  1. winfrom 去掉字符串空格
  2. 云计算之路-阿里云上:Web服务器请求到达量突降
  3. PYSQLITE用法初探
  4. 【SpringBoot】 配置文件的拆分
  5. mysql数据库自动关闭
  6. SecureCRT使用过程中 光标会丢失的问题
  7. Linux 的字符串截取很有用。有八种方法。
  8. [转]git merge 与 git rebase的区别
  9. k-means及变种
  10. docker基础学习中遇到的一些问题