这是去年校赛得题目,作为当时的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;
}
}