解題心得:
1、在明確使用DFS之后一定要找到遞歸函數的出口、方向,以及遞歸的點(在某個情況下開始遞歸)(void 也可以return,但是沒有返回值)。遞歸時也要有遞歸的方向,最后都能夠達到遞歸的出口。
2、在DFS遞歸的出口處可以用一個數組來進行記錄最終的結果,雙向遞歸可以用一個二位數組來記錄結果。
3、在循環中,盡量不要多次使用一個變量(不然找錯找得你哭瞎雙眼。傷心。。。。。。)。
4、先找思路再寫程序,寫程序時小心變量是否用對,數組是否越界,變量是否初始化,特別實在循環中時。當循環出現多層的時候,檢查關鍵的步驟是否放對循環。
5、找錯找得哭瞎雙眼的時候一定要反思總結啊。
Description
最近小Y迷上了數學,總是在思考各種數學問題。有一天,他不小心把墨水灑在草稿紙上。他現在能看到的是“2?3?1?4”(?表示看不清的地方)。小Y的記憶力不錯,他知道:
1、每個?只會是“+”、“-”,“=”三個符號之一。
2、總共有且僅有一個“=”。
3、原式一定是一個等式。如“2+3-1=4”
現在他突然想知道,有多少種可能性,滿足上面3個要求。
Input
多組輸入。
每組第一行有一個數字n。表示小Y從左到右,一共可以看到n個數字。(2<=n<=15)
每組第二行有n個數字。分別表示這n個數字是什么。保證每個數字都是非負整數,且小于10^7。
Output
對于每組,輸出一行,這一行只有一個數字,表示有多少種可能性滿足題意。
Sample Input
Raw
4
2 3 1 4
4
1 1 1 1
Sample Output
Raw
2
6
Hint
數字間一定有且僅有一個符號,第一個數字前沒有符號。
#include<stdio.h>
int a[16],i,j,jie[2][30000],k,l,n,d[2],b,z;//命名混亂
void DFS(int n,int sum)
{if(n == k)//遞歸的出口{jie[l][d[l]++] = sum; //二維數組記錄最終的結果return ;? //void也可以return 但沒有值}DFS(n+1,sum + a[n+b]);?? //‘+’DFS(n+1,sum - a[n+b]);?? //‘-’
}
int main()
{int num;while(scanf("%d",&n)!=EOF){num = 0;for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=1;i<n;i++){b = 0;k = i;l = 0;d[0] = 0;DFS(1,a[0]);b = i;k = n - i;l = 1;d[1] = 0;DFS(1,a[i]);for(z=0;z<d[0];z++)? //不要使用i,找瞎了雙眼{for(j=0;j<d[1];j++){if(jie[0][z] == jie[1][j])num++; //記錄個數}}}printf("%d\n",num);}
}