HDU1226:超级密码(BFS)

来源:互联网 发布:金融互助平台源码 编辑:程序博客网 时间:2024/06/06 00:32

题目链接
题意:给你m个范围为1~16的数,输出在c进制下能找到的n的最小的倍数。不能有前导零。找不到输出”give me the bomb please”。
关键点:
1.倍数的判断:答案最长是500位,不能直接取模判断。
2.如何去重:每位的数字在升序枚举的情况下,如果出现了前面出现过的余数不用加进队列。
(思路我是借鉴网上的代码,很抱歉我自己不是很能清晰的证明,自己做的时候是举了很多例子)

#include <bits/stdc++.h>using namespace std;int num[20];struct node{    int len=0;    int s[505];};int n,m,c;bool vis[5005];int  mod(node x){    int t=0;    for(int i=0; i<x.len; ++i)    {        t=(t*c+x.s[i])%n;/// 关键点1      }    return t;}void pr(node x){    for(int i=0; i<x.len; ++i)    {        if(0<=x.s[i]&&x.s[i]<=9)            printf("%d",x.s[i]);        else            printf("%c",'A'+x.s[i]-10);    }    printf("\n");}int bfs(){    memset(vis,0,sizeof(vis));///用的时候再memset。    node a,ne;    a.len=0;    queue<node>q;    for(int i=1; i<16; ++i)    {        ne=a;        if(num[i])        {            ne.s[ne.len]=i;            ne.len++;            int t=mod(ne);            if(!t)            {                pr(ne);                return 1;            }            else if(!vis[t])///关键点2                q.push(ne),vis[t]=1;        }    }    while(!q.empty())    {        a=q.front();        q.pop();        for(int i=0; i<16; ++i)        {            if(num[i])            {                ne=a;                ne.s[ne.len]=i;                ne.len++;                int t=mod(ne);                if(!t)                {                    pr(ne);                    return 1;                }                else if(!vis[t]&&ne.len<=500)///关键点2                    q.push(ne),vis[t]=1;            }        }    }    return 0;}int main(){//    freopen("in.txt","r",stdin);    int t;    scanf("%d",&t);    while(t--)    {        memset(num,0,sizeof(num));        scanf("%d%d%d",&n,&c,&m);        for(int i=0; i<m; ++i)        {            char ct;            scanf(" %c",&ct);            if('0'<=ct&&ct<='9')                num[ct-'0']++;            else                num[ct-'A'+10]++;        }        if(n==0)            if(!num[0])                printf("give me the bomb please\n");            else                printf("0\n");        else if(bfs()==0)            printf("give me the bomb please\n");    }    return 0;}