换种思考角度
在符合数字排列组合的情况下,观察数字是否为n的倍数。
于是从小到大查找,通过bfs状态转换。
循环节为n。表达困难,还请看代码
#include <algorithm> #include <string.h> #include <ctype.h> #include <stdio.h> #include <string> #include <vector> #include <queue> #include <stack> #include <cmath> #include <set> #include<cstdlib> #include<math.h> #include<iostream> #include<limits.h> #define ll long long #define clr(a,b) memset(a,b,sizeof(a)) #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 using namespace std; int n,m; int a[10]; int num[10005];//记录每位余数的真实数; int ans[10005]; int pre[10005]; int c = 0; void init() { clr(a,0); clr(num,-1); clr(pre,-1); } void pri(int t) { int c = 0; while(pre[t]!=-1) { ans[c++] = num[t]; t = pre[t]; } ans[c] = num[t]; for(int j = c; j >= 0; j--) printf("%d",ans[j]); } void bfs() { int t; queue <int> q; for(int i = 1; i < 10; i++)//queue预装1-9 { if(!a[i]) { t = i%n; if(t==0){printf("%d",i);return;} if(num[t]==-1) { q.push(t);num[t] = i; } } } //按位由小到大搜索 while(!q.empty()) { int u = q.front(); q.pop(); for(int i =0;i<10; i++) { if(!a[i]) { t = (u*10+i)%n; if(num[t]==-1) { num[t] = i; pre[t] = u; q.push(t); } if(t==0) { pri(t); return; } } } } printf("-1"); } int main() { int kase = 1; while(~scanf("%d%d",&n,&m)) { init(); int x; for(int i =1; i <= m; i++) { scanf("%d",&x); a[x] = 1; } printf("Case %d: ",kase++); bfs(); printf("\n"); } }
时间: 2024-10-12 22:50:30