X-man

导航

hdu 4474 Yet Another Multiple Problem

题意:

  找到一个n的倍数,这个数不能含有m个后续数字中的任何一个

题解:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
queue<int>que;
int used[10];
int flag[10010],pre[10010],value[10010];
int n,m;
void print(int n)
{
    if(n!=-1)
    {
        print(pre[n]);
        printf("%d",value[n]);
    }
}
void bfs()
{
    for(int i=1; i<=9; i++)
    {
        if(!used[i]&&!flag[i%n])
        {
            que.push(i%n);
            flag[i%n]=1;
            pre[i%n]=-1;
            value[i%n]=i;
        }
    }
    while(!que.empty())
    {
        int temp=que.front();
        if(temp==0)
        {
            print(pre[temp]);
            printf("%d\n",value[temp]);
            return ;
        }
        else
            for(int i=0; i<=9; i++)
            {
                if(!used[i]&&!flag[(temp*10+i)%n])
                {
                    que.push((temp*10+i)%n);
                    flag[(temp*10+i)%n]=1;
                    pre[(temp*10+i)%n]=temp;
                    value[(temp*10+i)%n]=i;
                }
            }
        que.pop();
    }
    printf("-1\n");
    return ;
}
int main()
{
    int ncase=1,m1;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        memset(used,0,sizeof(used));
        memset(flag,0,sizeof(flag));
        while(!que.empty())
            que.pop();
        for(int i=0; i<m; i++)
        {
            scanf("%d",&m1);
            if(!used[m1])
                used[m1]=1;
        }
        printf("Case %d: ",ncase++);
        bfs();
    }
    return 0;
}

 

 

广搜,同余剪枝

 A=MX+R
B=NX+R
假设A,B对于X的余数相同
那么
(10*A+d[i])%x
(10*B+d[i])%x
的意义是一样的,所以只有当余数没出现过的情况下才加入到搜索的队列中来

posted on 2013-10-31 20:46  雨钝风轻  阅读(305)  评论(0编辑  收藏  举报