【校内模拟8.5】【搜索】A
题目
解题思路
这个题跟纪中的火炬手还挺像的
不过本题搜索的是在后面添0/1能到达什么新状态(就是余数,如果两个数mod n余数相同,显然只需要保留小的那个)
代码
#include<iostream>
#include<cstdio>
using namespace std;
struct lzf{
int a[50];
}d[1000010];
bool vis[1000100];
int n,h,t=1,x,dq,q[1000010];
int main()
{
scanf("%d",&n);
if (n==1)
{
printf("1\n");
return 0;
}
q[1]=1;
d[1].a[1]=d[1].a[0]=1;
vis[1]=1;
while (h<t)
{
h++;
dq=q[h];
x=dq*10%n; //在后面多填一个0
if (!vis[x])
{
vis[x]=1;
d[x]=d[dq];
++d[x].a[0];
if (x==0)
{
for (int i=1;i<=d[x].a[0];i++)
printf("%d",d[x].a[i]);
return 0;
}
q[++t]=x;
}
x=(dq*10+1)%n; //在后面多填一个1
if (!vis[x])
{
vis[x]=1;
d[x]=d[dq];
d[x].a[++d[x].a[0]]=1;
if (x==0)
{
for (int i=1;i<=d[x].a[0];i++)
printf("%d",d[x].a[i]);
return 0;
}
q[++t]=x;
}
}
printf("-1");
return 0;
}