HDU 1226 超级密码(BFS)

来源:互联网 发布:dnf趣味数据怎么查 编辑:程序博客网 时间:2024/06/06 03:32

题意:

思路:跟网络赛的一样,少了一个= ,昨晚纠结了一个晚上。。。

#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <iostream>#include <queue>#include <stack>using namespace std;int n,m,k;int re[29];void init(){    scanf("%d%d%d",&n,&m,&k);    char ch[3];    for(int i=0;i<k;i++)    {        scanf("%s",ch);        if(ch[0]<='9'&&ch[0]>='0') re[i]=ch[0]-'0';        else re[i]=ch[0]-'A'+10;    }    sort(re,re+k);}int pre[5009];int v[5009];int ans[5009],cnt;queue<int> que;void find(int k){    if(pre[k]!=-1) find(pre[k]);    ans[cnt++] = v[k];}void solve(){    if(n==0){        if(re[0]!=0)        printf("give me the bomb please\n");        else        printf("0\n");        return ;    }    memset(v,-1,sizeof(v));    while(!que.empty()) que.pop();    for(int i=0;i<k;i++)    {        if(re[i]){            que.push(re[i]%n);            if(v[re[i]%n]==-1)            pre[re[i]%n]=-1,v[re[i]%n] = re[i];        }    }    while(!que.empty())    {        int e = que.front(); que.pop();        if(e==0) break ;        for(int i=0;i<k;i++)        {            int t = (e*m+re[i])%n;            if(v[t]!=-1) continue;            pre[t] = e;            v[t] = re[i];            que.push(t);        }    }    if(v[0]==-1){        printf("give me the bomb please\n");        return ;    }    cnt = 0;    find(0);    if(cnt>500){        printf("give me the bomb please\n");        return ;    }    for(int i=0;i<cnt;i++){        if(ans[i]<=9) printf("%d",ans[i]);        else printf("%c",ans[i]-10+'A');    }printf("\n");}int main(){    freopen("in.txt","r",stdin);    int cas;    scanf("%d",&cas);    while(cas--)    {        init();        solve();    }    return 0;}


原创粉丝点击