hdu - 1226 超级密码 (bfs)
2015-05-29 21:27
369 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1226
难以想到怎么去bfs,还是对状态的划分不明确,知道了之后感觉还是挺简单的。
这题关键是密码可能很长,然后判断是否整除用到了一点技巧,确保不会溢出,输出的时候是用递归回溯输出。
因为同一个数可以取多次,而最终取的是数值最小的,故输入之后从小到大排序,然后从第一个数到最后一个数每次添加一遍,直到找到合适的为止.
为了便于输出用了数组模拟队列.
难以想到怎么去bfs,还是对状态的划分不明确,知道了之后感觉还是挺简单的。
这题关键是密码可能很长,然后判断是否整除用到了一点技巧,确保不会溢出,输出的时候是用递归回溯输出。
因为同一个数可以取多次,而最终取的是数值最小的,故输入之后从小到大排序,然后从第一个数到最后一个数每次添加一遍,直到找到合适的为止.
为了便于输出用了数组模拟队列.
#include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; struct point { int mod; int digit; int pre; int step; }Queue[5001],init={0,0,-1}; int n,c,m; int num[20]; int used[5010]; void echo(int x) { if(Queue[x].pre==-1) return; else echo(Queue[x].pre); if(Queue[x].digit>=0&&Queue[x].digit<=9) printf("%c",Queue[x].digit+'0'); else printf("%c",Queue[x].digit+'A'-10); } void bfs() { memset(used,0,sizeof(used)); int front=0,rear=1; bool flag=0; Queue[0]=init; while(front!=rear) { point e=Queue[front]; for(int i=0;i<m;i++) { int ans=(e.mod*c+num[i])%n; // 计算余数是否为0 // printf("%d %d\n",num[i],ans); if(used[ans]||e.pre==-1&&num[i]==0||e.step>=500) continue; used[ans]=1; Queue[rear].pre=front; Queue[rear].digit=num[i]; Queue[rear].mod=ans; Queue[rear].step=e.step+1; if(ans==0) {echo(rear);printf("\n");flag=1;break;} rear++; } front++; } if(!flag) printf("give me the bomb please\n"); } int main() { freopen("a.txt","r",stdin); int t; char str[20]; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&c,&m); getchar(); for(int i=0;i<m;i++) { scanf("%s",str); if(str[0]>='0'&&str[0]<='9') num[i]=str[0]-'0'; else num[i]=10+str[0]-'A'; // printf("%d\n",num[i]); } sort(num,num+m); if(n==0) { if(num[0]==0) printf("0\n"); else printf("give me the bomb please\n"); } else bfs(); } return 0; }
相关文章推荐
- 彻底解决mysql中文乱码的办法
- Android优化技术详解-第八章 性能优化(笔记)
- LeetCode-java实现-T4Median of Two Sorted Arrays
- Linux内核信号处理机制介绍
- Firefox所有版本下载
- All Mark一下,自己的错误以及常见问题。
- IOS 点击空白处隐藏键盘的几种方法
- JAVA-DAY2
- [Java]选择排序
- WGS84,GCJ02, BD09坐标转换
- mysql 二级索引
- C++函数模板
- 弹指之间 -- Waltz
- Android Studio导出JavaDoc出现编码问题
- Git 相关资源
- 第十三周阅读项目(虚析构函数)
- Linux 链接脚本详解
- sgu239:Minesweeper(暴力)
- Linux下套接字详解(一)----TCP/UDP的区别与联系
- 【AOP】借助容器将服务与代理类分离