题目链接:http://poj.org/problem?id=1465
题意:用给定的m个数字构造一个数是n最小的倍数
思路:bfs搜索,用队列未果,然后用数组模拟的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 5000
#define maxm 10
using namespace std;
int n, m;
int num[maxm];
bool vis[maxn];
struct P
{
int x;
int num;
int ms;
}node[10000];
void print(int i)
{
if(node[i].x == -1) return;
print(node[i].x);
cout << node[i].num;
}
bool bfs()
{
int k = 0, l = 0;
memset(vis, 0, sizeof(vis));
P tmp;
tmp.x = -1;
tmp.ms = 0;
tmp.num = 0;
node[k++] = tmp;
// queue<P> Q;
//Q.push(tmp);
while(l < k)
{
P Pre = node[l++];
P cur;
//= Q.front(), cur;
// Q.pop();
if(!Pre.ms && Pre.x != -1)
{
print(Pre.x);
cout << Pre.num << endl;
return 1;
}
for(int i = 0; i < m; i++)
{
if(!num[i] && !Pre.ms) continue;
int tmp = (Pre.ms * 10 + num[i]) % n;
if(!vis[tmp])
{
vis[tmp] = 1;
cur.x = l - 1;
cur.ms = tmp;
cur.num = num[i];
node[k++] = cur;
//Q.push(cur);
}
}
}
return 0;
}
int main()
{
while(~scanf("%d %d", &n, &m))
{
for(int i = 0; i < m; i++)
{
scanf("%d", &num[i]);
}
sort(num, num + m);
if(!n)
{
cout << 0 << endl;
continue;
}
if(!bfs())
{
cout << 0 << endl;
}
}
return 0;
}