hdu1226

 hdu1226 :点击打开题目链接


本题目由于题目意思,容易得知是一道广搜的题目。

首先。 我们需要知道 ,大数取模,比如 如何判断1234567 对15 取模的数为多少?答案是7,但是如果他是大数怎么办,


 假设num数组存一个大数;左边为高位,右边为低位

int temp=0;

for(int i=最高位;i<=个位;i++)

temp=(temp * 某进制+num[i])%N;

return temp;   //  最终的temp就是bignumber  mod N 的值。


如果该余数出现过就没必要再次进队列了,因为此次模一样代表着下次的模也一样当这个数的模为0,那么前面的数模早已经为0,所以,后者没必要进队列。

  .12

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<string>
#include<string.h>
#include<queue>


using namespace std;
const int INF=~(1<<31);
const int MM=1005;

int N,C,M;
bool digit[18],vis[5005];

int mod(string& a)
{
    int temp=0;
    for(int i=0; i<a.size(); i++)
    {
        temp=(temp*C+(int)a[i])%N;
    }
    return temp;
}
void print(string& a)
{
    for(int i=0; i<a.size(); i++)
    {
        printf("%X",(int)a[i]);
    }
    cout<<endl;
}
bool bfs()
{
    queue<string>q;
    string a,b;
    for(int i=1; i<=15; i++)
    {
        if(digit[i])
        {
            a=(char)i;
            if(mod(a)==0)
            {
                print(a);
                return false;
            }
            q.push(a);
        }
    }
    while(!q.empty())
    {
        a=q.front();
        q.pop();
        for(int i=0; i<=15; i++)
        {
            if(digit[i]&&a.size()+1<=500)
            {
                b=a+(char)i;
                int mood=mod(b);
                if(mood==0)
                {
                    print(b);
                    return false;
                }
                else
                {
                    if(vis[mood]==0)
                    {
                        vis[mood]=1;
                        q.push(b);
                    }
                }
            }
        }
    }
    return true;
}
int main(void)
{
    int ncase;
    scanf("%d",&ncase);
    while(ncase--)
    {
        memset(digit,0,sizeof(digit));
        memset(vis,0,sizeof(vis));
        scanf("%d%d%d",&N,&C,&M);
        for(int i=0; i<M; i++)
        {
            int val;
            scanf("%x",&val);
            digit[val]=true;
        }
        if(N==0)
        {
            if(digit[0]) cout<<"0"<<endl;
            else cout<<"give me the bomb please"<<endl;
            continue;
        }
        if(bfs()) cout<<"give me the bomb please"<<endl;
    }
    return 0;
}


posted @ 2016-05-24 11:06  Code-dream  阅读(168)  评论(0编辑  收藏  举报