题意:每走一步将当前位置 cur 的值放进集合 set 中,每次从当前位置
往前或往后走的步数只能是 set 集合中的值,问到目的地 n 最少需要走多少步
ID-DFS
虽然只要得出最少步数,但是这题需要用搜索找出最优解的走法
dfs(cur) 表示已经求得最优解的前 cur 步
并保存第 cur 步的位置在 way[cur]
数组中
用 step 表示限制的递归深度
感觉 ID-dfs 跟 bfs 应该差不多,但是 bfs 保存解的话就比较麻烦
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int n;
int way[maxn];
int step; // upper bound
int ans;
//已经求得 way[1], ... way[cur], 要猜出 way[cur+1] 的值
bool dfs(int cur)
{
if( cur > step )
return false;
if( way[cur] == n )
return true;
if( way[cur] <= 0 || way[cur]>10000)
return false;
if( way[cur]*(1<<(step-cur)) < n) // 强剪枝
return false;
for(int i=0; i<=cur; i++)
{
way[cur+1] = way[cur] + way[i];
if(dfs(cur+1))
return true;
way[cur+1] = way[cur] - way[i];
if(dfs(cur+1))
return true;
}
return false;
}
int main()
{
while(cin>>n && n)
{
if(n==1)
{
cout<<0<<endl;
continue;
}
step=1;
while(true)
{
way[0] = 1;
if(dfs(0))
break;
step++;
}
cout<<step<<endl;
}
return 0;
}