题目意思就不用说了,懂的都懂。这道题其实直接 bfs 就能解决了(场上没细看啊啊啊)。
emmm,先结合样例,想想怎么利用bfs推出这个样例。给大家看个图:
(虽然说搬课件上的图有点儿可耻但是我懒得画了)
所以说这道题其实也没啥复杂的,直接分别从 1~k 开始一步一步搜就完事了(因为不能有前导 0,所以这里直接把 0 干掉了)。
下面先给大家看个我在赛后写的炸缸代码:
#include<bits/stdc++.h>
using namespace std;
int k,m;
int minn[1010];
void bfs()
{
queue<string>q;
q.push(to_string(0));
while(!q.empty())
{
string tmp=q.front();
q.pop();
int num=0;
for(int i=0;i<tmp.size();i++)
{
num*=10;
num+=int(tmp[i]-'0');
}
for(int i=0;i<k;i++)
{
int a=num;
a*=10;
a+=k;//这个错误就纯抽象了。
if(a%m==0&&a!=0)
{
cout<<a;
return;
}
else if(a==0)
{
break;//同样也是一个很抽象的错误。
}
else
{
if(minn[a%m]>=a)
{
break;
}
else
{
minn[a%m]=a;
}
}
q.push(to_string(a));
}
}
}
int main()
{
cin>>k>>m;
memset(minn,0x3f3f3f3f,sizeof(minn));
bfs();
return 0;
}
上面那个代码已知有两个离谱的错误,但是改完之后还是和改之前一样,输入样例根本没有输出(我在信友队上测的话就是直接还我一个 Wrong Answer 然后就没了,输出都没了)。
下面是正确的代码;
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int k,m;
int vis[N];
struct node
{
string x;//这个数字
int m;//余数
};
void bfs()
{
queue<node>q;
for(int i=1;i<k;i++)
{
vis[i]=1;
q.push({to_string(i),i%m});//初始化,给1~k都扔要搜的节点里
}
while(!q.empty())
{
node x=q.front();
q.pop();
if(x.m==0)
{
cout<<x.x;
return;
}//余数为 0,直接输出,结束!
for(int i=0;i<k;i++)
{
int nx=x.m*10+i;
if(vis[nx%m])
{
continue;
}
vis[nx%m]=1;
q.push({x.x+to_string(i),nx%m});//往后面加数字,判断这个数字的余数有没有被前面的数字搜到过,如果这个余数的值已经被搜到过了,直接不用管;否则这个数字继续入队。
}
}
}
int main()
{
cin>>k>>m;
bfs();//这里直接把 bfs 套上去就行。
return 0;
}