思路:一开始看的到这个题时,想都没想直接一个暴力上去了,结果很显然。再后来做完后面的题,在回看这个题时,想到了广搜。写一个简单(没剪枝)的广搜,自己随便测试一下,一个9能测出来,然后直接就上了5个9,电脑直接死机了(电脑性能太差)。没办法啊!开机重启,中间又花费了很多时间,我不死心,又重新测试一下,结果还是一样。后来这个题考试时没写出来。上网查了一博客,豁然开朗(我果然还是菜鸟)。
题解:这个题主要运用同余定理,广搜加剪枝,为了节省时间,我们在结构体中使用一个变量。这个变量是对于n取余后的值,每次只需对这个变量乘10或者乘10+1;在对n取余即可,这样可减少时间。
#include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
bool book[1100000];
int n;
struct node
{
int data;
string s;
};
void bfs()
{
queue<node>Q;
node p;
p.s=p.s+'1';
p.data=1;
book[1]=true;
Q.push(p);
while(!Q.empty())
{
node p,q;
p=Q.front();
Q.pop();
for(int i=0; i<=1; i++)
{
int term=(p.data*10+i)%n;
if(term==0)
{
p.s+='0'+i;
cout<<p.s<<endl;
return ;
}
if(book[term])
continue;
book[term]=true;
q.data=term;
q.s=p.s+(char)('0'+i);
Q.push(q);
}
}
return ;
}
int main()
{
while(~scanf("%d",&n))
{
memset(book,false,sizeof(book));
if(n==1)
{
printf("1\n");
continue;
}
bfs();
}
return 0;
}