HDU 1226 超级password

跟POJ 1465 multiple 类是。仅仅只是多了2个条件,长度不能超过500。还有就是 可能不是十进制。


bfs+同余定理,就是用 mod 来判重。

G++ 15ms


每次枚举一位,然后记录下路径然后输出就能够。



此题坑点 当n==0 的时候 假设 m个数中有0 那么答案就是0 假设没有0 就是give me the bomb please

这儿坑了我好几次。


#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<vector>
#include<cmath>

#define INF 0x7fffffff
#define eps 1e-8
#define LL long long
#define PI 3.141592654
#define CLR(a,b) memset(a,b,sizeof(a))
#define FOR(i,a,n) for(int i= a;i< n ;i++)
#define FOR0(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
#define mp make_pair
#define ft first
#define sd second
#define acfun std::ios::sync_with_stdio(false)

#define SIZE 500+1
using namespace std;

int n,c,m;
int a[17];

struct lx
{
    int x,mod;
    int len;
    int path;
    void init(int xx,int mm,int ll,int pp)
    {
        x=xx,mod=mm,len=ll,path=pp;
    }
}q[5001];

void bfs()
{
    int h=0,e=0;
    bool vis[5001];
    CLR(vis,0);
    lx tmp;
    tmp.init(-1,0,0,-1);
    q[h++]=tmp;
    while(e<h)
    {
        tmp=q[e++];

        if(tmp.mod==0&&tmp.x!=-1)
        {
            stack<char>out;
            while(tmp.path!=-1)
            {
                char temp;
                if(tmp.x<10&&tmp.x>=0)
                    temp=tmp.x+'0';
                else
                    temp=tmp.x-10+'A';
                out.push(temp);
                tmp=q[tmp.path];
            }
            while(!out.empty())
            {
                printf("%c",out.top());
                out.pop();
            }
            printf("\n");
            return;
        }

        FOR(k,0,m)
        {
            int num=tmp.mod*c+a[k];
            int mod=num%n;
            if(a[k]==0&&tmp.len==0)continue;
            if(vis[mod]||tmp.len>=500)continue;
            lx now;
            vis[mod]=1;
            now.init(a[k],mod,tmp.len+1,e-1);
            q[h++]=now;
        }
    }
    puts("give me the bomb please");
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&c,&m);
        FOR(i,0,m)
        scanf("%X",&a[i]);
        sort(a,a+m);
        if(n==0)
        {
            if(a[0]==0)
            puts("0");
            else
            puts("give me the bomb please");
            continue;
        }
        bfs();
    }
}


posted @ 2017-05-26 12:48  llguanli  阅读(226)  评论(0编辑  收藏  举报