/* 这个代码运行的时间长主要是因为每次枚举之后都要重新计算一下和的值! 如果要快的话,应该在dfs,也就是枚举的过程中计算出前边的数值(这种方法见第二个代码),直到最后,这样不必每一次枚举都要从头再算一遍值! */ 1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 7 char ch[20]; 8 char sign[3]={ '+', '-', '.'}; 9 int n, cnt;10 int num[20];11 int signNum[200];12 13 void dfs(int u){14 if(u==n){15 if(signNum['+']==n-1 || signNum['+']+signNum['.']==n-1 || signNum['.']==n-1 || signNum['-']==n-1) return;16 for(int i=1; i 9)22 s=s*100+(++i);23 else s=s*10+(++i);24 }25 if(s>10000) return ;//非得加上这句话....然后就幸运的过了!26 num[v]=s;27 --i;28 }29 }30 num[n]=n;31 int s=num[1];32 for(int i=1; i
/* 清晰的思路,清晰的代码.....T^T! */ 1 #include2 #include 3 #include 4 #include 5 using namespace std; 6 char sign[3]={ '+', '-', '.'}; 7 int n, cnt; 8 char ch[20]; 9 int dir[2]={ 10, 100};10 11 12 //pre记录的是'+' 或者是 '-'的左边的运算值, nowI记录的是其右边的值 13 void dfs(char chPre, int pre, int nowI, int cur){14 if(cur==n){15 int s=-1;16 if(chPre=='+')17 s=pre+(nowI*dir[cur/10]+cur);18 else if(chPre=='-')19 s=pre-(nowI*dir[cur/10]+cur);20 //如果chPre=='.' 说明整个式子中不存在运算符号+或者-, 那最终的结果一定不是0 21 if(s==0){22 ++cnt;23 if(cnt<=20){24 for(int i=1; i