[USACO2.3.3][zerosum零的算式和][dfs]

[USACO2.3.3][zerosum零的算式和][dfs]

代码:

#include
#include
#include
int n;

void
dfs(int a,int b,int ans[10])
{
  int i; 
  if(b==n-1){
    ans[b]=a;
	int sum=1,last=1;
    for(i=1;i<=n-1;i++){
		if(ans[i]==1){
            if(last<0){
			  sum=sum-last+last*10-(i+1);
			  last=last*10-(i+1);
            }
            if(last>=0){
			  sum=sum-last+last*10+(i+1);
			  last=last*10+(i+1);
            }
		}
		if(ans[i]==2){
			last=i+1;
			sum=sum+last;
		}
		if(ans[i]==3){
			last=-i-1;
			sum=sum+last;
		}
	}
	if(sum==0){
		printf("1");
		for(i=2;i<=n;i++){
			if(ans[i-1]==1)printf(" %d",i);
			if(ans[i-1]==2)printf("+%d",i);
			if(ans[i-1]==3)printf("-%d",i);
		}
		printf("\n");
	}
    return;
  }
  ans[b]=a;
  for(i=1;i<=3;i++){
    dfs(i,b+1,ans);
  }
  return;
}

int main()
{
  int ans[10]={0};
  int i;
  scanf("%d",&;;;;n);
  for(i=1;i<=3;i++){
    dfs(i,1,ans);
  }
  system("pause");
  return 0;
}

 

 

思路:普通的dfs三层,不超时。

主要需要考虑的是最后的判断。计算。

posted @ 2012-07-18 15:03  Mose  阅读(152)  评论(0编辑  收藏  举报