题意:求由X得到X^n的最少步数。
分析:迭代加深搜索。
剪枝:1、如果大于当前限制的深度,停止搜索。
2、如果当前的数通过自身相乘(即指数相加 最快方式)都不能达到n,停止搜索。
感想:
写到后来越来越像什么用dfs搜索某个集合的幂集中有多少元素,取和不取某个数,然后继续搜。。
真的很像啊。。。虽然我每次都写不好DFS。。。
#include<cstdio>
using namespace std;
int vis[2010];
int flag,deep,n;
void dfs(int pos)
{
int t;
if(pos>deep || (vis[pos]<<(deep-pos))<n || flag) return;
if(vis[pos]==n)
{
flag=1;
return;
}
for(int i=1;i<=pos;i++)
{
if(flag) return;
t=vis[pos]+vis[i];
if(t>0 && t<2000)
{
vis[pos+1]=t;
dfs(pos+1);
}
t=vis[pos]-vis[i];
if(t>0 && t<2000)
{
vis[pos+1]=t;
dfs(pos+1);
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
deep=0,flag=0;
vis[1]=1;
while(!flag)
{
deep++;
dfs(1);
}
printf("%d\n",deep-1);
}
return 0;
}