poj3134 Power Calculus

  1. 题意:给定一个n,从x出发只用乘除法,求出算出x^n的最小步数。即从1出发只用加减法算出n的最小步数。
  2. 分析:求最小步数想到用bfs,但bfs不能记录已经到达过的状态结果,又想到用dfs,但盲目的dfs,状态太多,时间开销太大,所以选择使用IDDFS。

code:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int n,dp,a[1005];

 bool iddfs(int t,int Max)
{
	if (a[t]==n) return true;
	if (t>=dp) return false;//超过迭代深度
    Max=max(Max,a[t]);
	if (Max>n&&a[t]>n) return false;
	if (Max*(1<<(dp-t))a[i]) a[t+1]=a[t]-a[i];
		else a[t+1]=a[i]-a[t];
		if (iddfs(t+1,Max)) return true;
	} 
	return false;
}

 int main()
{
	while (scanf("%d",&n)&&n)
	{
		if (n==1) printf("0\n");
		else
		{
			a[0]=1; 
			for (dp=1; 1; dp++)
				if (iddfs(0,1)) 
				{
					printf("%d\n",dp); break;
				}
		}
	}
	return 0;
}

你可能感兴趣的:(poj3134 Power Calculus)