[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三层,不超时。
主要需要考虑的是最后的判断。计算。