poj3262 Prime Path 素数打表+bfs
2016-07-05 13:51
288 查看
传送门:poj3262 Prime Path
1033
1733
3733
3739
3779
8779
8179
输入:第一行输入有n组数据,
接下来的n行数据,每一行有两个四位整数,要求从第一个变换为第二个数,
输出变换次数
题目大意
两个四位数a,b,要求从a变到b,每次只能变四位中的一位,并且每次变换之后必须是素数,比如:从1033变到8179会经历下面几个过程:1033
1733
3733
3739
3779
8779
8179
输入:第一行输入有n组数据,
接下来的n行数据,每一行有两个四位整数,要求从第一个变换为第二个数,
输出变换次数
解题思路
这个和poj 3278 Catch That Cow十分类似,都是一样的水题,不过多了一个素数打表,然后只要四位数的区间AC代码
#include<cstdio> #include<cstring> #include<set> #include<stack> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<queue> #include<cstdlib> #include<iostream> using namespace std; typedef long long LL; //lld int primeTable[10005]; int sum; bool vis[10005]; bool isPrime(int n) { for(int i=0;i<sum;i++) if(primeTable[i] == n) return true; return false; } int prime() { int tempPrimeTable[10005]; int i,j,k; for(i=0;i<10000;i++) tempPrimeTable[i] = 1; for(i=2;i<=100;i++) for(j=i+i;j<10000;j+=i) tempPrimeTable[j] = 0; k=0; for(i=2;i<10000;i++) if(tempPrimeTable[i] && i>1000) primeTable[k++] = i; return k; } struct Node{ int step; int pos; }; int bfs(int startPos,int endPos) { queue<Node>q; memset(vis,false,sizeof(vis)); int i,j; Node cur; Node next; cur.step = 0; cur.pos = startPos; q.push(cur); vis[startPos] = true; int tmp; while(!q.empty()) { cur = q.front(); q.pop(); if(cur.pos == endPos) return cur.step; for(i=1;i<=39;i++) { if(i>=1 && i<=9) { int kb = cur.pos%1000; tmp = i*1000+kb; if(vis[tmp] || !isPrime(tmp) || vis[tmp]) continue; next.step = cur.step+1; next.pos = tmp; q.push(next); } if(i>9 && i<=19) { int kb = cur.pos/1000; int hb = cur.pos%100; tmp = kb*1000 + (i-10)*100+hb; if(vis[tmp] || !isPrime(tmp) || vis[tmp] ) continue; next.step = cur.step+1; next.pos = tmp; q.push(next); } if(i>19 && i<=29) { int hb = cur.pos/100; int fb = cur.pos%10; tmp = hb*100 + (i-20)*10 + fb; if(vis[tmp] || !isPrime(tmp) || vis[tmp]) continue; next.step = cur.step+1; next.pos = tmp; q.push(next); } if(i>29 && i<=39) { int db = cur.pos/10; tmp = db*10 + (i-30); if(vis[tmp] || !isPrime(tmp) || vis[tmp]) continue; next.step = cur.step+1; next.pos = tmp; q.push(next); } vis[tmp] = true; } } } int main() { sum = prime(); int t; scanf("%d",&t); int startDigit,endDigit; while(t--) { scanf("%d%d",&startDigit,&endDigit); int ans = bfs(startDigit,endDigit); if(ans!=-1) printf("%d\n",ans); else printf("Impossible\n"); } return 0; }
相关文章推荐
- 聊一聊HTML5存储的那些事儿!
- axure7实现省市联动效果
- SQL Server 批量更新字段值为ROW_NUMBER()+列名称
- mysql 密码修改
- git的操作说明
- SSIS excel2003文件导入列名显示为F1,F2 - FN
- spring四种依赖注入方式
- 转载{NSDecimalNumber.h}
- mysql5.7大小写敏感
- 窥探PTAM之姿态估计
- mybatis与spring3.1整合
- Spring AOP详解 (转) 以及IOC(个人理解)
- 每日一笑(1)
- php调用mysql存储过程的详解
- 点积应用-求两个向量夹角
- 在centos里安装Nginx
- 理解Windows内核模式与用户模式
- 【工具】Linux下VIM编辑器的使用
- Xcode7 使用NSURL发送HTTP请求报错
- sql server和mysql常用字段类型对比