HDU1226 超级密码
来源:互联网 发布:初音手办淘宝 编辑:程序博客网 时间:2024/05/18 23:57
超级密码
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4526 Accepted Submission(s): 1470
Problem Description
Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:
密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.
注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
密码是一个C进制的数,并且只能由给定的M个数字构成,同时密码是一个给定十进制整数N(0<=N<=5000)的正整数倍(如果存在多个满足条件的数,那么最小的那个就是密码),如果这样的密码存在,那么当你输入它以后门将打开,如果不存在这样的密码......那就把门炸了吧.
注意:由于宝藏的历史久远,当时的系统最多只能保存500位密码.因此如果得到的密码长度大于500也不能用来开启房门,这种情况也被认为密码不存在.
Input
输入数据的第一行是一个整数T(1<=T<=300),表示测试数据的数量.每组测试数据的第一行是两个整数N(0<=N<=5000)和C(2<=C<=16),其中N表示的是题目描述中的给定十进制整数,C是密码的进制数.测试数据的第二行是一个整数M(1<=M<=16),它表示构成密码的数字的数量,然后是M个数字用来表示构成密码的数字.两个测试数据之间会有一个空行隔开.
注意:在给出的M个数字中,如果存在超过10的数,我们约定用A来表示10,B来表示11,C来表示12,D来表示13,E来表示14,F来表示15.我保证输入数据都是合法的.
注意:在给出的M个数字中,如果存在超过10的数,我们约定用A来表示10,B来表示11,C来表示12,D来表示13,E来表示14,F来表示15.我保证输入数据都是合法的.
Output
对于每组测试数据,如果存在要求的密码,则输出该密码,如果密码不存在,则输出"give me the bomb please".
注意:构成密码的数字不一定全部都要用上;密码有可能非常长,不要试图用一个整型变量来保存密码;我保证密码最高位不为0(除非密码本身就是0).
注意:构成密码的数字不一定全部都要用上;密码有可能非常长,不要试图用一个整型变量来保存密码;我保证密码最高位不为0(除非密码本身就是0).
Sample Input
322 1037 0 12 101125 163A B C
Sample Output
110give me the bomb pleaseCCBHuge input, scanf is recommended.HintHint
刚开始没有一点思路,后来看了别人的题解,才知道,通过位数进行bfs搜索,不断累加
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;int T;int C;int M;int N;int num[20];int vis[5005];typedef struct node { int res[505];//存储各位 int len;} node;int mod(node t) { int ans = 0; for(int i = 0;i < t.len;i++) { ans = (ans * C + t.res[i]) % N; } return ans;}void output(node t) { for(int i = 0;i < t.len;i++) { if(t.res[i] <= 9) printf("%d",t.res[i]); else printf("%c",t.res[i] - 10 + 'A'); } printf("\n");}bool bfs() { queue<node> q; node t; t.len = 0; memset(vis,0,sizeof(vis)); for(int i = 1;i < 16;i++) { if(num[i]) { t.res[0] = i; t.len = 1; int tmp = mod(t); if(!tmp) { output(t); return true; } else { if(!vis[tmp]) { vis[tmp] = 1; q.push(t); } } } } while(!q.empty()) { t = q.front(); q.pop(); for(int i = 0;i < 16;i++) { if(num[i]) { t.res[t.len] = i; t.len++; int tmp = mod(t); if(!tmp) { output(t); return true; } else { if(!vis[tmp] && t.len < 500) { vis[tmp] = 1; q.push(t); } } t.len--; } } } return false;}int main() { cin >> T; while(T--) { cin >> N >> C; cin >> M; memset(num,0,sizeof(num)); for(int i = 0;i < M;i++) { char c[2]; scanf("%s",c); if(c[0] >= '0' && c[0] <= '9') { num[c[0] - '0'] = 1; } else { num[c[0] - 'A' + 10] = 1; } } if(N) { bool flag; flag = bfs(); if(!flag) { printf("give me the bomb please\n"); } } else { if(num[0]) { printf("0\n"); } else { printf("give me the bomb please\n"); } } } return 0;}
阅读全文
0 0
- hdu1226 超级密码 bfs
- HDU1226:超级密码(BFS)
- HDU1226:超级密码(BFS)
- HDU1226:超级密码(BFS)
- hdu1226 超级密码
- HDU1226超级密码(BFS)
- hdu1226 超级密码 (BFS)
- HDU1226 超级密码(BFS)
- hdu1226 超级密码--BFS
- HDU1226 超级密码
- hdu1226超级密码 bfs
- 超级密码hdu1226 bfs
- HDU1226:超级密码(BFS)
- HDU1226 超级密码
- hdu1226超级密码(简单bfs)
- BFS+一点点数学 HDU1226超级密码
- BFS+一点点数学 HDU1226超级密码
- HDU1226超级密码(宽搜+记忆化搜索)
- Java作业
- 使用Mybatis Generator 工具逆向
- 请不要滥用SharedPreference
- Spring IOC/DI
- Codeforces 888D
- HDU1226 超级密码
- 驱动程序无法使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误: RSA premaster secret error
- Being a Hero HDU
- 自传--2017.11.10
- 树莓派U盘挂载位置
- pinpoint插件开发之一:牛刀小试,调整gson插件
- 基于数据库的分布式锁实现
- iOS开发—使用GCD下载图片
- java三大特性封装、继承、多态概述