POJ 1465

来源:互联网 发布:淘宝店铺首页大图图片 编辑:程序博客网 时间:2024/06/05 14:24

BFS可解此题,但是必须要剪枝,考虑一个问题:A%N=R 设A=n*N+R那么(A*10+Ki)%N=(N*n*10+R*10+Ki)%N=(R*10+Ki)%N我们可以发现这个数值只和R与Ki有关所以我们先排序然后以一个数组记录余数,第二次出现这个余数的时候和前面出现这个余数的那种情况进行想同变换必定可以得出相同的结果,但是我们只要最小的那个,所以后面出现了相同余数的统统舍去即可。

#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;int judge[5010];struct ans{    int num;    int yu;    int w;}q[5010];int date[5010];void print(ans p){        if(p.w!=-1) print(q[p.w]);        if(p.w!=-1) printf("%d",p.num);}int main(){    int n,m;    while(cin>>m){        cin>>n;        //printf("yes");        for(int i=0;i<n;i++) cin>>date[i];        if(m==0){            printf("0\n");            continue;        }        //printf("yes");        sort(date,date+n);        //printf("yes");        memset(judge,0,sizeof(judge));        q[0].yu=0;        q[0].num=0;        q[0].w=-1;        int l,f,yes;        f=0;        l=1;        yes=0;        while(f<l){        //printf("yes");            ans now=q[f];            ans p;            int ys;            for(int i=0;i<n;i++){                ys=(10*now.yu+date[i])%m;                if(judge[ys]==0&&(now.w!=-1||date[i]!=0)){                    p.yu=ys;                    p.num=date[i];                    p.w=f;                    judge[ys]=1;                    q[l++]=p;                    if(ys==0){                        print(p);                        printf("\n");                        yes=1;                        break;                    }                }            }            f++;            if(yes==1) break;        }        if(yes==0){            printf("0\n");        }    }    return 0;}


0 0
原创粉丝点击