hdu 1664如此爽的一道bfs+数论
2015-10-21 00:03
218 查看
这道题真的是要靠第三感觉,首先题目没有给定数字答案的大小限制,应该想到有条件可以限制这个数字的大小。
囧。。。。。。。。毕竟菜鸟,完全没想法。
ps:一个数论中的结论:对于任意的整数n,必然存在一个由不多于两个的数来组成的一个倍数。因为a,aa,aaa……取n+1个,则必有两个模n余数相同,相减即得n的倍数m。而m只由a、0组成。
先用一个数来搜答案,9种情况,已经搜到答案就输出,没有则再用两个数来搜答案,36种情况。当然,要注意答案必须是不同的数的个数最少,有不同答案的话再输出最小的。
囧。。。。。。。。毕竟菜鸟,完全没想法。
ps:一个数论中的结论:对于任意的整数n,必然存在一个由不多于两个的数来组成的一个倍数。因为a,aa,aaa……取n+1个,则必有两个模n余数相同,相减即得n的倍数m。而m只由a、0组成。
先用一个数来搜答案,9种情况,已经搜到答案就输出,没有则再用两个数来搜答案,36种情况。当然,要注意答案必须是不同的数的个数最少,有不同答案的话再输出最小的。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #define maxn 65540 using namespace std; int n,m,mcnt,tcnt,h; int a[5]; bool vis[maxn]; // 取余判重 string ans,tans; struct Node { int d,val,pre; // val-有效值 int cnt; } cur,now,q[maxn]; void getans(int k)// 递归得到ans 避免在结构体中添加string 每次操作string很拖时间 { char c; if(k==-1) return ; else { getans(q[k].pre); c=q[k].d+'0'; tans+=c; } } bool bfs(int k) { int i,j,nval,ncnt,tval; int head=0,tail=-1; memset(vis,0,sizeof(vis)); for(i=1; i<=k; i++) { if(a[i]) { cur.cnt=0; cur.d=a[i]; cur.pre=-1; cur.val=a[i]%n; vis[cur.val]=1; q[++tail]=cur; } } while(head<=tail) { now=q[head]; nval=now.val; ncnt=now.cnt; if(ncnt>mcnt) break ; // 剪枝 if(!nval) { h=head; tcnt=ncnt; return true ; } for(i=1; i<=k; i++) { tval=(nval*10+a[i])%n; if(!vis[tval]) { vis[tval]=1; cur.cnt=ncnt+1; cur.d=a[i]; cur.pre=head; cur.val=tval; q[++tail]=cur; } } head++; } return false; } int main() { int i,j,flag; while(scanf("%d",&n),n) { flag=0; ans="xx"; mcnt=1000000000; for(i=1; i<=9; i++) // 先搜一个数能否组成n的倍数 { a[1]=i; if(bfs(1)) { tans=""; getans(h); if(mcnt>tcnt||mcnt==tcnt&&ans>tans) // 注意怎么比较ans的大小 { ans=tans; mcnt=tcnt; } } } if(ans!="xx") { flag=1; cout<<ans<<endl; } if(flag) continue ; for(i=0; i<=9; i++) // 再搜两个数 { a[1]=i; for(j=i+1; j<=9; j++) { a[2]=j; if(bfs(2)) { tans=""; getans(h); if(mcnt>tcnt||mcnt==tcnt&&ans>tans) { ans=tans; mcnt=tcnt; } } } } cout<<ans<<endl; } return 0; }
相关文章推荐
- 在软件部署中使用 strace 进行调试
- 在 Linux 上用 strace 来理解系统调用
- Apache PDFBox 2.0.0 RC1 发布下载
- Linux执行.sh文件时提示No such file or directory该怎么办(三种解决办法)
- Linux中rz命令和sz命令使用详解大全
- JSP下载服务器文件的方法
- JSP导出Excel文件的方法
- JSP实现远程文件下载保存到服务器指定目录中的方法
- Linux正则表达式特性详解及BRE与ERE的异同点
- Linux下如何使用grep命令查找带有tab(退格)的字符
- 如何建立ASP.NET站点
- ASP.NET清空缓存时遇到的问题简析
- PHP实现清除wordpress里恶意代码
- PHP 实现的将图片转换为TXT
- PHP中的switch语句的用法实例详解
- PHP中使用substr()截取字符串出现中文乱码问题该怎么办
- php获取汉字拼音首字母的方法
- 使用xampp搭建运行php虚拟主机的详细步骤
- 功能强大的PHP图片处理类(水印、透明度、旋转)
- 为你总结一些php系统类函数