题解 P2841 【A*B Problem】
这道题真的是一道非常有趣的搜索题呢,非常适合使用迭代加深搜索来解决这个问题。
不过看到题解里没有人用迭代加深搜索方法来解这道题,那就我来介绍一下迭代加深搜索的写法!
一般人都会想到这道题的一种搜索写法:枚举
这时候,我们就可以考虑一下:
迭代加深搜索!
1.题意分析
对于本题而言:由于
于是,我们可以将本题的题意改写为:找到一个最小的
2.迭代加深搜索
所谓迭代加深搜索,就是一个对于深度优先搜索的一个优化。我们考虑从小到大枚举深度优先搜索的深度上限
3.一些优化
有了这样的思路,我们可以轻松拿到
这样,我们可以写出如下代码:
#include<iostream>
#include<cstdio>
using namespace std;
int a,d;
int b[100010];
int m[10010];
int cnt(int x)
{
if(!x) return 0;
return cnt(x/10)+1;
}
int dfs(int dep,int o)
{
if(dep>d)
{
if(o==0)
{
int f=0,c=0;
for(int i=1;i<=d;i++)
{
c=c*10+b[i];
if(c>=a)
{
f=1;
}
if(f)
{
printf("%d",c/a);
}
c%=a;
}
printf(" ");
for(int i=1;i<=d;i++)
{
printf("%d",b[i]);
}
printf("\n",c/a);
return 1;
}
return 0;
}
if(m[o]<=dep&&m[o])
{
return 0;
}
m[o]=dep;
if(dep!=1)
{
b[dep]=0;
if(dfs(dep+1,o*10%a))
{
return 1;
}
}
b[dep]=1;
return dfs(dep+1,(o*10+1)%a);
}
void iddfs()
{
for(d=cnt(a);;d++)
{
fill(m,m+a,0);
if(dfs(1,0))
{
break;
}
}
}
int main()
{
cin>>a;
iddfs();
return 0;
}