用 1 0 枚举来宽搜 用MOD来判断是否到达目标状态。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int n,k;
vector <int> path;
struct node
{
int mod; //该点对应的MOD
int set; //记录路径输出的上一个节点
int x; //加入的是1 还 是0
};
int vis[205];
node queue[1000005];
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(!n)break;
int head=0,tail=0;
int i;
memset(vis,0,sizeof(vis));
path.clear();
queue[tail].x=1;
queue[tail].set=-1;
queue[tail++].mod=1%n;
while(head < tail)
{
node t = queue[head];
// printf("mod=%d\n",t.mod);
if(t.mod == 0)
{
for(i=head;queue[i].set!=-1;i=queue[i].set)
path.push_back(i); //把路径记录下来
printf("1"); //第一位一定是 1
for(i=path.size()-1;i>=0;i--)
printf("%d",queue[path[i]].x);
printf("\n");
break;
}
if(!vis[(t.mod * 10)%n]) //加0的情况
{
queue[tail].mod = t.mod * 10 % n;
queue[tail].x = 0;
queue[tail++].set=head;
vis[(t.mod * 10)%n]=1;
}
if(!vis[(t.mod * 10 + 1)%n]) //加1的情况
{
queue[tail].mod = (t.mod * 10 +1) % n;
queue[tail].x = 1;
queue[tail++].set=head;
vis[(t.mod * 10 + 1)%n]=1;
}
head++;
}
}
return 0;
}