2012ACM/ICPC成都赛区现场赛K题---Yet Another Multiple Problem(hdu4474)

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

     题意:一个简单的BFS,用没出现的数字进行BFS,最后递归输出结果。

     题解:如果当前在队首的为n ,则接下来要进队的是m=(n*10+i)%n;若m=0,则递归输出结果,相同的m只需进队一次。

代码:

#include <cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int> que;
int used[10];
int flag[10010],pre[10010],vlaue[10010];
//flag[]标记m是否进过对列,pre[]保存前一个m,而vlaue[]则保存对应m的i值
int n,m;
void print(int n)//递归输出结果
{
    if(n!=-1)
    {
        print(pre[n]);
        printf("%d",vlaue[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;//首位的前一个值为-1,作为递归输出的结束条件
            vlaue[i%n] = i;
        }
    }

    while(!que.empty())
    {
        int temp = que.front();
        if(temp == 0)
        {
             print(pre[temp]);
             printf("%d\n",vlaue[temp]);
             return;
        }

        else
        {
            for(int i=0;i<=9;i++)
            {
                if(!used[i] && !flag[(temp*10+i)%n])
                {//数字i未出现,并且(temp*10+i)%n未进队列过,则进队
                    que.push((temp*10+i)%n);
                    flag[(temp*10+i)%n] = 1;
                    pre[(temp*10+i)%n] = temp;
                    vlaue[(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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值