題目: 下面都是「-
」。 下圖是由
14個「+」和
14個「
-」組成的符號三角形。
2個同號下面都是「+」,
2個異號下面都是「-」。
在一般情況下,符號三角形的第一行有n
個符號。符號三角形問題要求對於給定的
n,計算有多少個不同的符號三角形,使其所含的「
+」和「
-」的個數相同。
思路:我們首先要遍歷第一行的所有情況(為了簡化問題,我們用0代表+,1代表-,這樣根據異或的規則,正好滿足題意,又方便了計數)。
注意這裡要有剪枝,通過觀察我們發現,滿足條件的所有三角形中除了初始的3個字元的三角形,其他所有滿足結果要求的子三角形中,+和-的個數都是相同的,
這樣我們進行剪枝,不等的直接return。另外乙個是要特判初始的總數,奇數肯定是不行的。然後注意回溯的時候對sum值進行修改。
剩下的就是dfs的功底了。
#include#include#include#includeusing namespace std;
int n,half,ans,sum;
int s[100][100];
void dfs(int t,int sum)
{ if(sum>half||t*(t-1)/2-sum>half)//已經算出的子樹不滿足,剪枝
return ;
if(t>n)//滿足要求,相等
{ ans++;
/* 輸出滿足條件的矩陣
for(int i=1;i<=n;i++)
{for(int j=1;j<=n;j++)
cout<>n)
{ ans=0,sum=0;
half=n*(n+1)/2;
memset(s,0,sizeof(s));
if(half%2!=0)//總數是奇數直接判0
{ cout<<0<
符號三角形之回溯演算法
下圖是由 14個 和 14個 組成的符號三角形。2個同號下面都是 2個異號下面都是 個符號。符號三角形問題要求對於給定的 n,計算有多少個不同的符號三角形,使其所含的 和 的個數相同。include define max 100 int arr max max int n int sum 2 int...
符號三角形 回溯演算法 C
題目描述 符號三角問題 下圖是由14個 和14個 組成的符號三角形。2個同號下面都是 2個異號下面都是 在一般情況下,符號三角形的第一行有n個符號。符號三角形問題要求對於給定的n,計算有多少個不同的符號三角形,使其所含的 和 的個數相同。參考計算機演算法設計與分析第五版 王曉東 如下 include...
演算法設計 符號三角形(回溯)
給定第一行的符號 只有 數目n,每行比上一行數目少一 形成乙個倒三角 2個相同符號下面為 號,2個不同符號下面為 號,要求有多少種情況使得兩種符號數目相同。第一行為7的符號三角形之一 我們發現 由於只有兩種符號,所以我們可簡化為0 1形式 總符號數為n n 1 2,如果總數為奇數,那麼一定不可能符號...