hdu 4474 大整数取模+bfs

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4474

 

(a*10+b)%c = ((a%c)*10+b%c)%c;

然后从高位开始枚举能填的数字填充,只是注意最高位(第一位)不能为0。

代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<queue>
using namespace std;

struct Node
{
    string s;
    int mod;
    Node(string s="",int mod=0): s(s),mod(mod) {}
};

bool can[15];
bool vis[10050];
string ans;

bool bfs(int n)
{
    queue<Node> Q;

    string temp = "";
    Q.push(Node(temp,0));

    while(!Q.empty())
    {
        Node node = Q.front();
        Q.pop();

        if(node.mod == 0 && node.s != "" && node.s!="0")
        {
            ans = node.s;
            return true;
        }

        for(int i=0; i<=9; i++)
        {
            if(!can[i] ) continue;
            if(i == 0 && node.s == "") continue;
            int mod = (node.mod*10 + i)%n;
            if(vis[mod]) continue;

            temp = node.s + char(i + '0');
            vis[mod] = true;

            Q.push(Node(temp,mod));
        }
    }
    return false;
}

int main()
{
    //freopen("E:\\acm\\input.txt","r",stdin);

    int n,m;
    int T = 0;
    while(cin>>n>>m)
    {
        for(int i=0; i<=9; i++) can[i] = true;
        for(int i=0; i<m; i++)
        {
            int a;
            scanf("%d",&a);
            can[a] = false;
        }
        ans = "";
        memset(vis,0,sizeof(vis));
        printf("Case %d: ",++T);

        if(!bfs(n))
            printf("-1\n");
        else
            cout<<ans<<endl;
    }
}
View Code

 

posted @ 2013-10-05 18:57  等待最好的两个人  阅读(195)  评论(0编辑  收藏  举报