HDU 1976 prime path
2016-02-06 18:50
302 查看
题意:给你2个数n m。从n变成m最少须要改变多少次。
当中:
1、n m 都是4位数
2、每次仅仅能改变n的一个位数(个位、十位、百位、千位),且每次改变后后的新数为素数
思路:搜索的变形题,这次我们要搜得方向是改变位数中的一位,然后往下搜。直到求出我们须要的那个解
当中:
1、n m 都是4位数
2、每次仅仅能改变n的一个位数(个位、十位、百位、千位),且每次改变后后的新数为素数
思路:搜索的变形题,这次我们要搜得方向是改变位数中的一位,然后往下搜。直到求出我们须要的那个解
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> using namespace std; #define N 10000 int dis ,cou ; bool prime ; void make() //素数打表 { int i,j; for(i=1000;i<=N;i++) { int flag=1; for(j=2;j<i/2;j++) { if(i%j==0) { prime[i]=false; flag=0; break; } } if(flag)prime[i]=true; } } int bfs(int x,int y) { queue <int>q; int v,i,j,temp,vtemp,t[4]; //t数组存放该数的每一位数 memset(dis,0,sizeof(dis)); memset(cou,0,sizeof(cou)); q.push(x); dis[x]=1; while(!q.empty()) { v=q.front(); q.pop(); t[0]=v/1000; t[1]=v%1000/100; t[2]=v%100/10; t[3]=v%10; for(j=0;j<4;j++) { temp=t[j]; for(i=0;i<10;i++) if(i!=temp) { t[j]=i; vtemp=t[0]*1000+t[1]*100+t[2]*10+t[3]; if(!dis[vtemp]&&prime[vtemp]){ cou[vtemp]=cou[v]+1; dis[vtemp]=1; q.push(vtemp); } if(vtemp==y) return cou[vtemp]; } t[j]=temp; } if(v==y) return cou[v]; } return -1; } int main() { int t,n,m,sum; make(); scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); sum=bfs(n,m); printf("%d\n",sum); } return 0; }
相关文章推荐
- RocEDU.阅读.写作《乌合之众》(一)
- POJ3281 Dining(最大流)
- Kinect For Windows V2开发日志一:开发环境的配置
- 导航控制器 UINavigationController
- 【分享】GEARS of DRAGOON 1+2【日文硬盘版】[带全CG存档&攻略+SSG修改+打开存档补丁]
- java学习心得——代码重铸
- hdu5086——Revenge of Segment Tree
- HDU 4859(Bestcoder #1 1003)海岸线(网络流之最小割)
- mysql jdbc的使用
- Java基础——I/O
- Paltform总线与其它总线框架的关系探究
- 第一周总结
- 3-04. 一元多项式的乘法与加法运算(20)(ZJU_PAT 结构体)
- 学习笔记------数据结构(C语言版) 队列的顺序存储/循环队列
- 配对堆
- 【图论】2-sat总结
- 浏览器加载和渲染HTML的顺序
- 1007. 素数对猜想
- Hibernate中inverse="true"的理解
- NYOJ-102-次方求模