您的位置:首页 > 其它

HDU 1226 超级密码(BFS)

2012-10-12 08:56 465 查看
题意:

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: