poj 3126 Prime Path bfs
2015-09-08 21:37
274 查看
题目大意:
给定两个四位素数a b,要求把a变换到b
变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复。求从a到b最少需要的变换次数。无法变换则输出Impossible。
解题思路:
数组模拟队列,先打出10000以内的素数表,然后bfs搜索每一位变化后是否为素数,直到变为b;
代码:
给定两个四位素数a b,要求把a变换到b
变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复。求从a到b最少需要的变换次数。无法变换则输出Impossible。
解题思路:
数组模拟队列,先打出10000以内的素数表,然后bfs搜索每一位变化后是否为素数,直到变为b;
代码:
#include <iostream> #include <string.h> using namespace std; struct node { int num; int step; }; int vis[15000]; void get()//素数打表 { memset(vis,0,sizeof(vis)); vis[0]=1; vis[1]=1; for(int i=2;i<10005;i++) { if(!vis[i]) { for(int j=i+i;j<10005;j+=i) vis[j]=1; } } } int a,b; int flag[15000];//用来标记当前数是否出现过 node que[15000]; void bfs() { int head,tail; que[head=tail=0].num=a; que[tail++].step=0; flag[a]=1; while(head<tail)//模拟队列 { node x=que[head++]; if(x.num==b) { cout<<x.step<<endl; return; } int ge=x.num%10;//获取个位数 int dec=(x.num/10)%10;//获取十位数 for(int i=1;i<=9;i+=2)//变化个位,偶数忽略 { int y=(x.num/10)*10+i; if(!vis[y]&&!flag[y]&&y!=x.num) { flag[y]=1; que[tail].num=y; que[tail++].step=x.step+1; } } for(int i=0;i<=9;i++)//变化十位 { int y=(x.num/100)*100+i*10+ge; if(!vis[y]&&!flag[y]&&y!=x.num) { flag[y]=1; que[tail].num=y; que[tail++].step=x.step+1; } } for(int i=0;i<=9;i++)//百位 { int y=(x.num/1000)*1000+i*100+dec*10+ge; if(!vis[y]&&!flag[y]&&y!=x.num) { flag[y]=1; que[tail].num=y; que[tail++].step=x.step+1; } } for(int i=1;i<=9;i++)//千位,此时千位从1开始 { int y=x.num%1000+i*1000; if(!vis[y]&&!flag[y]&&y!=x.num) { flag[y]=1; que[tail].num=y; que[tail++].step=x.step+1; } } } cout<<"Impossible"<<endl; } int main() { int t; cin>>t; get(); while(t--) { cin>>a>>b; memset(flag,0,sizeof(flag)); bfs(); } return 0; }
相关文章推荐
- TCP/IP各层协议、工作设备、网络地址划分总结 《TCP-IP详解卷1:协议》读书笔记一 概述(内附思维导图)
- C++ Primer中Sales_item.h代码解析
- rejected execution (queue capacity 50)
- 使用python-sftp协议下载远程主机数据
- ReactiveCocoa 专题
- Codevs 3116 高精度练习之加法
- Contains Duplicate II
- ScrollView 高度
- 15_09-08 英语单词学习
- Codevs 3115 高精度练习之减法
- CodeForces 343D Water Tree(dfs序+线段树区间更新)
- Java学习积累one
- UVA 624 CD (01 背包)
- 存储器管理
- 文件上传组件 FileUpload 的使用
- JSP九大内置详解
- 常用Keytool 命令
- android广播大全
- 常用Keytool 命令
- Linux dd命令全面解析