如下圖是由14個「+」和14個「-」組成的符號三角形, 2個同號下面都是「+」,2個異號下面都是「-」。
1 - + + - + + +
2 - + - - + +
3 - - + - +
4 + - - -
5 - + +
6 - +
7 -在一般情況下,符號三角形的第一行有n個符號, 符號三角形問題要求對於給定的n, 計算有多少個不同的符號三角形,使其所含的「+」和「-」的個數相同。 這是在書本中回溯裡的一道題目,回溯約等於深度優先搜尋
回溯的大概:如果一種情況可能,繼續往下遞迴直到邊界;如果超出了限定條件就剪枝,所以能一直遞迴到邊界的一定是未被剪枝也就是符合條件的情況,即答案。
在這道題當中,可以得到限制:== 「+」,「-」數量相等,總數量為偶數。==
並且當三角形的第一行確定後,整個三角形也可以確定。所以方法就是嘗試第一行的內容,通過剪枝、遞迴得到答案。
暈了,這咋這麼大
上圖就是它遞迴的大概,每次新加乙個點,都會斜著新加一排。
注意! 每次新加的點都要分為兩種情況:+ 和 -;
下面是**:
#include
using namespace std;
int n;
int half;
int sum;
int count;
//1代表+ ; 0代表- ; count就是+的計數
int p[
100]
[100];
void
dfs(
int t)
;int
main()
half =
(n+1
)* n /4;
// + 和 - 都不能超過half
sum =0;
//答案數初始化;
count =0;
dfs(0)
;printf
("%d"
,sum)
;return0;
}void
dfs(
int t)
//第t步,也就是第一行的第t位
//如果還有位子,乙個位子要嘗試 + - 兩種情況
for(
int i =
0; i <
2; i++)if
(count <= half &&
(t+2)*
(t+1)/
2- count <= half)
//當前圖形中+ -都沒超過一半
//還原本次,考慮下乙個符號
for(
int j =
1; j <= t; j++)
count -
= i;
}}
符號三角形問題
符號三角形問題 右圖所示的三角形中,有14個 和14個 2個同號下面是 兩個異號下面是 在一般情況下,符號三角形的第一行有n個符號。符號三角形問題,要求對於給定的n,計算有多少個不同的符號三角形,使其所含的 和 相同。解 首先要求產生的 與 的數量一樣多,所以當給定的n不能滿足 n 1 n 4 0的...
符號三角形問題
輸入 n 1輸出不同方案的個數.注意 純打表必和諧掉,不信就試試 有限打表,測試輸入 期待的輸出 時間限制 記憶體限制 額外程序 測試用例 1 以文字方式顯示 2 3 以文字方式顯示 0 4 1秒64m 0 include include includeusing namespace std int...
符號三角形(dfs)
問題描述 如下圖是由14個 和14個 組成的符號三角形,2個同號下面都是 2個異號下面都是 在一般情況下,符號三角形的第一行有n個符號,符號三角形問題要求對於給定的n,計算有多少個不同的符號三角形,使其所含的 和 的個數相同。解題思路 1 不斷改變第一行每個符號,搜尋符合條件的解,可以使用遞迴回溯 ...