題目描述:
現在有乙個序列123......n,其中n介於3和15之間,要求在序列之間加入+、-或者空格,使得該序列組成的數學表示式的運算結果為0。
輸入:
輸入可能包含多個測試樣例。
對於每個測試案例,輸入整數n(3<=n<=15),代表這個序列的長度。
輸出:
對應每個測試案例,輸出所有使得表示式結果為0的組合,當有多個組合時,按字典序進行排序輸出。
樣例輸入:
3樣例輸出:6
1+2-31_2+3-4-5-6相當於12+3-4-5-6(『_』代表空格)1 2+3-4-5-6
思路:
對於3<=n<=15,總共有3^n種情況,當n=15時,總共有14348907種情況,所以對於給定的n,我們都可以在1秒內窮舉完。對於窮舉,當然用dfs是最方便的,我寫的**基本是對所有的情況都遍歷一遍,當然如果覺得效率還不行,可以加些適當的減枝。**如下:
1 #include 2view code3intn;4
int op[20];5
6void
print_ans()
720 printf("
%d\n
", i);21}
22int
is_ok()
2343 ans +=temp;44}
45else
if (op[i] == 1)46
55 ans +=temp;56}
57else
5867 ans -=temp;68}
69}70return
ans;71}
72void dfs(int
index)
7380
//空格
81 op[index] = 0
;82 dfs(index + 1
);83//加
84 op[index] = 1
;85 dfs(index + 1
);86//減
87 op[index] = 2
;88 dfs(index + 1
);89}90
int main(void)91
關鍵的**是dfs函式,分別對空格,加,減進行窮舉,op[index]存放了第index位置存放的是哪種情況(0表示空格,1表示加,2表示減),如果index為n,則說明得到了一種可能,函式is_ok就是用於判斷當前的情況是否能使得表示式最終的結果為0,如果為0,則輸出並返回,否則直接返回。
is_ok函式是用於判斷放在op陣列中的表示式是否滿足條件,計算表示式比較麻煩的是為空格的情況,由於空格可以首先出現,在「+」後面出現,在「-」後面出現,is_ok中的**則依次處理這三種情況。還有就是如果空格後面是個2位數,空格前面組成的數要向左移動兩位,如果是1位數,只用移動1位。
正規表示式匹配(dfs)
請實現乙個函式用來匹配包含 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 abaca 匹配,但與 aa.a 和 ab a 均不匹配。示例 1 輸入 s aa p a ...
表示式 表示式樹 表示式求值
總時間限制 1000ms 記憶體限制 65535kb 描述 眾所周知,任何乙個表示式,都可以用一棵表示式樹來表示。例如,表示式a b c,可以表示為如下的表示式樹 a b c 現在,給你乙個中綴表示式,這個中綴表示式用變數來表示 不含數字 請你將這個中綴表示式用表示式二叉樹的形式輸出出來。輸入輸入分...
DFS訓練(2)逆波蘭表示式
這一題倒不是dfs,其實應該歸為遞迴的運用。一定要適應遞迴的思維,該題完全適合使用遞迴的思路,看輸入的量,如果是數字,即為表示式的值,若為運算符號,則再輸入兩個表示式進行運算,反映到程式中即為下列遞迴的思路。總時間限制 1000ms 記憶體限制 65536kb 描述逆波蘭表示式是一種把運算子前置的算...