zoukankan      html  css  js  c++  java
  • 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;
    }
    


  • 相关阅读:
    会计基础第二次模拟题(4)
    会计基础第二次模拟题(3)
    会计基础第二次模拟题(2)
    如何使用印象笔记进行更好的学习呢?
    怎么安装WinXP和Win7双系统
    清理和关闭多余的Windows 7系统服务
    Foxmail邮箱最新应用指南二
    Windows 系统提示“内存不足”的原因及解决方法
    会计基础第二次模拟试题(1)
    关于后端程序开发如何评估工作量的方法
  • 原文地址:https://www.cnblogs.com/coded-ream/p/7207975.html
Copyright © 2011-2022 走看看