这是去年校赛得题目,作为当时的fresh man 我们水水地硬是人工枚举把答案暴力出来了,今天回过头来写,感觉大不一样了! 一道简单的DFS #include<iostream> using namespace std; int n,num; void dfs(int k,int tmp,int last,int c)//k表示接下来要在k与k+1中间进行处理,tmp当前获得值,last表示最后一次加上或减去的数,c表示最后一次进行的运算 ,1表示‘+’,0表示‘-’
{
if(n==k){if(tmp==0)num++;return;} dfs(k+1,tmp+k+1,k+1,1); dfs(k+1,tmp-k-1,k+1,0); if(c==1)dfs(k+1,(tmp-last)+(last*10+k+1),last*10+k+1,1); if(c==0) dfs(k+1,(tmp+last)-(last*10+k+1),last*10+k+1,0); } int main() { while(cin>>n) { num=0; dfs(1,1,1,1); cout<<num<<endl; } }