本来想刷道签到题结果被卡住了。这题题意描述有点问题,数字又不一定都是个位数。。。难道是我英语太差了? digits就表示0~9这几个数?唉,还是太弱了。这题就是用了一个bfs,应该说还是有点意思的,直接模拟复杂度肯定爆炸,而且还不好判无解的情况。而bfs复杂度是n*10的,因为%n相同的状态搜索过程都是相同的,相当于一堆循环节,而无解的情况也好判了,状态都搜完后还没有%n为0的就无解了,因为剩下的都是一堆循环节,也不可能搜到解了。

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=10010;
struct node{
    int m,f,x;
}q[maxn],A,B;
int cas,n,m,can[15],head,tail,vis[maxn],flag;
void print(int x){
    if(!x)return;
    print(q[x].f);
    printf("%d",q[x].x);
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        ++cas;flag=0;int x;
        memset(vis,0,sizeof(vis));
        memset(can,0,sizeof(can));
        for(int i=1;i<=m;++i){
            scanf("%d",&x);can[x]=1;
        }
        printf("Case %d: ",cas);
        head=tail=0;
        for(int i=1;i<=9;++i)if(!can[i]){
            A.m=i%n;A.x=i;A.f=0;
            if(!A.m){printf("%d\n",i);flag=1;break;}
            if(!vis[A.m]){
                q[++tail]=A;vis[A.m]=1;
            }
        }
        if(flag)continue;
        while(head<tail){
            B=q[++head];
            for(int i=0;i<=9;++i)if(!can[i]){
                A.m=(B.m*10+i)%n;
                A.x=i;A.f=head;
                if(vis[A.m])continue;
                vis[A.m]=1;q[++tail]=A;
                if(!A.m){flag=1;break;}
            }
            if(flag)break;
        }
        if(flag){
            print(tail);printf("\n");
        }
        else{puts("-1");}
    }
    //system("pause");
    return 0;
}
/*
2345 3
7 8 9
100 1
0
*/

 

posted on 2018-01-20 09:37  湮灭之瞳  阅读(186)  评论(0编辑  收藏  举报