尋找表示式(dfs)

2022-07-09 21:57:14 字數 1629 閱讀 7541

題目描述:

現在有乙個序列123......n,其中n介於3和15之間,要求在序列之間加入+、-或者空格,使得該序列組成的數學表示式的運算結果為0。

輸入:

輸入可能包含多個測試樣例。

對於每個測試案例,輸入整數n(3<=n<=15),代表這個序列的長度。

輸出:

對應每個測試案例,輸出所有使得表示式結果為0的組合,當有多個組合時,按字典序進行排序輸出。

樣例輸入:

3

6

樣例輸出:

1+2-3

1 2+3-4-5-6

1_2+3-4-5-6相當於12+3-4-5-6(『_』代表空格)

思路:

對於3<=n<=15,總共有3^n種情況,當n=15時,總共有14348907種情況,所以對於給定的n,我們都可以在1秒內窮舉完。對於窮舉,當然用dfs是最方便的,我寫的**基本是對所有的情況都遍歷一遍,當然如果覺得效率還不行,可以加些適當的減枝。**如下:

1 #include 2

3intn;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

view code

關鍵的**是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 描述逆波蘭表示式是一種把運算子前置的算...