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