hdu - 1226 超级密码 (bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1226

难以想到怎么去bfs,还是对状态的划分不明确,知道了之后感觉还是挺简单的。

这题关键是密码可能很长,然后判断是否整除用到了一点技巧,确保不会溢出,输出的时候是用递归回溯输出。

因为同一个数可以取多次,而最终取的是数值最小的,故输入之后从小到大排序,然后从第一个数到最后一个数每次添加一遍,直到找到合适的为止.

为了便于输出用了数组模拟队列.

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #include <algorithm>
 5 using namespace std;
 6 struct point
 7 {
 8     int mod;
 9     int digit;
10     int pre;
11     int step;
12 }Queue[5001],init={0,0,-1};
13 int n,c,m;
14 int num[20];
15 int used[5010];
16
17 void echo(int x)
18 {
19     if(Queue[x].pre==-1) return;
20     else echo(Queue[x].pre);
21     if(Queue[x].digit>=0&&Queue[x].digit<=9) printf("%c",Queue[x].digit+‘0‘);
22     else printf("%c",Queue[x].digit+‘A‘-10);
23 }
24 void bfs()
25 {
26     memset(used,0,sizeof(used));
27     int front=0,rear=1;
28     bool flag=0;
29     Queue[0]=init;
30     while(front!=rear)
31     {
32         point e=Queue[front];
33         for(int i=0;i<m;i++)
34         {
35             int ans=(e.mod*c+num[i])%n;   // 计算余数是否为0
36           //  printf("%d %d\n",num[i],ans);
37             if(used[ans]||e.pre==-1&&num[i]==0||e.step>=500) continue;
38             used[ans]=1;
39             Queue[rear].pre=front;
40             Queue[rear].digit=num[i];
41             Queue[rear].mod=ans;
42             Queue[rear].step=e.step+1;
43             if(ans==0) {echo(rear);printf("\n");flag=1;break;}
44             rear++;
45         }
46         front++;
47     }
48     if(!flag) printf("give me the bomb please\n");
49 }
50 int main()
51 {
52     freopen("a.txt","r",stdin);
53     int t;
54     char str[20];
55     scanf("%d",&t);
56     while(t--)
57     {
58         scanf("%d%d%d",&n,&c,&m);
59         getchar();
60         for(int i=0;i<m;i++)
61         {
62             scanf("%s",str);
63             if(str[0]>=‘0‘&&str[0]<=‘9‘) num[i]=str[0]-‘0‘;
64             else num[i]=10+str[0]-‘A‘;
65            // printf("%d\n",num[i]);
66         }
67         sort(num,num+m);
68         if(n==0)
69         {
70             if(num[0]==0) printf("0\n");
71             else printf("give me the bomb please\n");
72         }
73         else bfs();
74     }
75     return 0;
76 }
时间: 2024-10-05 04:58:30

hdu - 1226 超级密码 (bfs)的相关文章

hdu 1226 超级密码 BFS 挺不错的题啊!

超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2883    Accepted Submission(s): 928 Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进制的

hdu 1226 超级密码 bfs+取余判重

超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2808    Accepted Submission(s): 897 Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进制的

hdu 1226 超级密码

超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3110    Accepted Submission(s): 1006 Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息: 密码是一个C进制

HDOJ 1226 超级密码(bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1226 思路分析:题目要求寻找一串长度不大于500的C进制的密码,且该密码需要为十进制数N的整数倍. <1>搜索方式选择:由于密码的长度未知(题目限制最大为500),所以状态树的深度比较深,采用dfs搜索效率比较低,选择bfs搜索更好. <2>剪枝方法:题目中对于每个状态需要采用模运算判断是否为N的整数倍: 由模运算的性质:设存在两个整数a和b,如果a%n==b%n,那么(a*x+c)%

hdoj 1226 超级密码 【隐式图BFS】

题目:hdoj 1226 超级密码 分析:这题属于隐式图搜索,状态不是很明显,需要自己建立. 其实搜索说白了就是暴力. 这个题目就是,首先对给出的可以组成的所有的数依次枚举,长度从小到大. 比如第一组样例,因为0不能出现在首位,那么我们枚举首位为1 和 7 看看漫步满足, 满足的话枚举第二位10 11 17 以及 70 71 77 顺便保存他们取余 n 之后的值,这样就可以剪枝,搜索过的就不用重复搜索了. 要求最早出现的BFS即可,第一个搜到的就是. 注意长度不大于500 AC代码: #incl

超级密码(bfs)

超级密码 Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 4   Accepted Submission(s) : 0 Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密 码是一个C进制的数,并且只能由

超级密码(dfs)

超级密码233 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3406    Accepted Submission(s): 1080 Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密码是一个C进

hdu 1226(同余搜索)

超级密码 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3866    Accepted Submission(s): 1241 Problem Description Ignatius花了一个星期的时间终于找到了传说中的宝藏,宝藏被放在一个房间里,房间的门用密码锁起来了,在门旁边的墙上有一些关于密码的提示信息:密 码是一个C进制的

hdu 1429 状压bfs

#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <queue> #include <map> #define inf 0x3f3f3f3f #define ll __in