符號三角形(dfs)

2021-07-25 18:05:56 字數 1122 閱讀 2447

問題描述: 

如下圖是由14個「+」和14個「-」組成的符號三角形, 2個同號下面都是「+」,2個異號下面都是「-」。 

- + + - + + +  

- + - - + +  

- - + - +  

+ - - -  

- + +  

- +  

- 在一般情況下,符號三角形的第一行有n個符號, 符號三角形問題要求對於給定的n, 

計算有多少個不同的符號三角形,使其所含的「+」和「-」的個數相同。 

解題思路: 

1、不斷改變第一行每個符號,搜尋符合條件的解,可以使用遞迴回溯 

為了便於運算,設+ 為0,- 為1,這樣可以使用異或運算子表示符號三角形的關係 

++為+即0^0=0, --為+即1^1=0, +-為-即0^1=1, -+為-即1^0=1; 

2、因為兩種符號個數相同,可以對題解樹剪枝, 

當所有符號總數為奇數時無解,當某種符號超過總數一半時無解 

#include#includeusing namespace std;

int map[1100][1100];

int n,ans,sum,cnt;//cnt用於統計-號個數

//"+" 是0,」-「是1

void dfs(int step,int cnt)//第一行所在的列數

dfs(1,0);

cout<

#include#includeusing namespace std;

int p[1001][1001];

int sum;

int n;

int half;

int cnt;

void dfs(int t)

{ if((cnt>half)|| ((t*(t-1)/2-cnt)>half) )return;

if(t>n)

{ for(int i=1;i<=n;i++)

{ for(int j=n+1-i;j>=1;j--)

if(p[i][j]==1)cout<<"+ ";

else cout<<"- ";

cout<>n;

if((n*(n+1)/2)&1)

{ cout<

符號三角形問題

符號三角形問題 右圖所示的三角形中,有14個 和14個 2個同號下面是 兩個異號下面是 在一般情況下,符號三角形的第一行有n個符號。符號三角形問題,要求對於給定的n,計算有多少個不同的符號三角形,使其所含的 和 相同。解 首先要求產生的 與 的數量一樣多,所以當給定的n不能滿足 n 1 n 4 0的...

符號三角形問題

如下圖是由14個 和14個 組成的符號三角形,2個同號下面都是 2個異號下面都是 1 2 3 4 5 6 7 在一般情況下,符號三角形的第一行有n個符號,符號三角形問題要求對於給定的n,計算有多少個不同的符號三角形,使其所含的 和 的個數相同。這是在書本中回溯裡的一道題目,回溯約等於深度優先搜尋 回...

符號三角形問題

輸入 n 1輸出不同方案的個數.注意 純打表必和諧掉,不信就試試 有限打表,測試輸入 期待的輸出 時間限制 記憶體限制 額外程序 測試用例 1 以文字方式顯示 2 3 以文字方式顯示 0 4 1秒64m 0 include include includeusing namespace std int...