一道简单BFS
我觉得这题很有Codeforces A,B题风格,就是让你通过一系列的加减乘除转换,把某个数通过最少的次数变成另一个数…(类似这种意识)
其实,这题,只要简单地做一个BFS就可以了,记得,要剪枝!!!
#include <bits/stdc++.h>
using namespace std;
int s;
struct node{int dis,v,c;};
inline void bfs()
{
queue<node>q;
for (register int i=1; i*i<=s; ++i)
if (s%i==0)
{
q.push((node){i,i,1});
if (i*i!=s) q.push((node){s/i,s/i,1});
}
while (q.size())
{
node u=q.front(); q.pop();
for (register int i=2; i<=9; ++i)
if (u.dis+u.v*i<s && (s-u.dis)%(u.v*i)==0)
{
q.push((node){u.dis+u.v*i,u.v*i,u.c+1});
}
else if (u.dis+u.v*i==s)
{
printf("%d\n",u.c+1);
return;
}
}
printf("%d\n",-1);
}
int main(){
scanf("%d",&s);
bfs();
return 0;
}