HDU(4394),数论上的BFS
2016-07-27 17:43
357 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4394
思路很巧妙,要找到m,可以这样思考,n的个位是有m的个位决定的,从0-9搜一遍,满足情况的话就继续搜索m的十位,这里的状态转移可以利用之前的m,因为m是在m的自身上增加的,这时,其实个位是已经满足情况了,而且,n的个位,十位,百位等等是很难单独取出来的,所以就直接取完后面的全部数字。
思路很巧妙,要找到m,可以这样思考,n的个位是有m的个位决定的,从0-9搜一遍,满足情况的话就继续搜索m的十位,这里的状态转移可以利用之前的m,因为m是在m的自身上增加的,这时,其实个位是已经满足情况了,而且,n的个位,十位,百位等等是很难单独取出来的,所以就直接取完后面的全部数字。
#include <stdio.h> #include <queue> #include <math.h> using namespace std; struct NUM { long long num; int len; bool operator < (const NUM &a) const { return a.num < num; } }; int main() { int t; scanf("%d",&t); while(t--) { priority_queue<NUM> Q; int n; scanf("%d",&n); NUM a,next; a.len = 0; a.num = 0; Q.push(a); bool flag = false; while(!Q.empty()) { a = Q.top(); Q.pop(); if(a.num*a.num%(int)pow(10,a.len)==n) { flag = true; break; } a.len++; for(int i=0; i<=9; i++) { next = a; next.num +=i*(int)pow(10,a.len-1); //printf("%d %d\n",next.num,next.len); //printf("%d %d\n",next.num*next.num%(int)pow(10,next.len),n%(int)pow(10,next.len)); if(next.num*next.num%(int)pow(10,next.len)==n%(int)pow(10,next.len)) Q.push(next); } } if(flag) printf("%d\n",a.num); else printf("None\n"); } return 0; }
相关文章推荐
- Windows 64位驱动 关闭内存保护
- 如何Mysql 复制中的延迟?
- SpringMVC拦截器
- WebService的调用
- MongoDB学习整理
- angularjs学习笔记--服务
- iOS 使用AFN 进行单图和多图上传
- Java集合---ConcurrentHashMap原理分析[转]
- Qt之线程基础
- Android CalendarView 控件的 getDate() 方法有错误
- IOS使用Reachability实时检测网络连接状况
- Android Xfermode 实战 实现圆形、圆角图片
- oracle数据库一些基本sql操作
- Oracle数据库的CONNECT BY ROWNUM研究
- java基础知识复习
- Android应用获取设备序列号
- Qt之线程基础
- Qt之线程基础
- vmware ubuntu14.04虚拟机不能正常拷贝文件到windows且不能自适应虚拟机屏幕窗口自动变化的解决办法
- myBatis :以接口方式交互数据