1. 程式人生 > >符號三角形問題C++程式碼

符號三角形問題C++程式碼

/*下面都是"-"。 下圖是由14個"+"和14個"-"組成的符號三角形。2個同號下面都是"+",2個異號下面都是"-"。
+ + - + - + +
+ - - - - +
- + + + -
- + + -
- + -
- -
+
在一般情況下,符號三角形的第一行有n個符號。符號三角形問題要求對於給定的n,計算有多少個不同的符號三角形,使其所含的"+"和"-"的個數相同。
許多 信安08-3班 08083701*/
#include <iostream>
using namespace std;
class Triangle
{
private:
int n;//第一行的符號數量
int **p;//儲存+ -號,0表示-,1表示+
int count;//記錄+號數量,根據+號數量,可以用i*(i+1)/2-count求出減號數量
int sum;//記錄+與-數量相等且等於num*(num+1)/4的情況
const int half;//加號=等號=總符號數/2
public:
//建構函式
Triangle(int n):half(n*(n+1)/4)
{
this->n=n;
count=0;
sum=0;

p=new int* [n+1];
for(int i=0;i<=n;i++)
{
p[i]=new int[n+1];//開闢一個num*num的矩陣,用於在回溯過程中記錄三角形符號分佈
}
}
//呼叫回溯演算法,並且先判斷num*(num+1)/2是否為奇數
void triangleSolve();
void Backtrack(int t);
void display();

};

void Triangle::Backtrack(int t)
{
if ((count>half)||(t*(t-1)/2-count>half)) return;
if (t>n) sum++;
else
for (int i=0;i<2;i++) {
p[1][t]=i;
count+=i;
for (int j=2;j<=t;j++) {
p[j][t-j+1]=p[j-1][t-j+1]^p[j-1][t-j+2];//相同則為1,不同則為0,代表題目的規則.1為+,0為-
count+=p[j][t-j+1];
}
Backtrack(t+1);
for ( j=2;j<=t;j++)
count-=p[j][t-j+1];
count-=i;
}
}


void Triangle::triangleSolve()
{
if(n*(n+1)/2%2==0)
{
Backtrack(1);
display();
}
else
{
cout<<"不存在可能性"<<endl;
return;
}
}
void Triangle::display()
{
cout<<"邊長為"<<n<<"的情況下,一共有"<<sum<<"種符號三角形具有同等數量的+與-號"<<endl;
}

int main()
{
int n;
cout<<"請輸入第一行符號的數量n,[n*(n+1)整除4]:";
cin>>n;
Triangle test(n);//設定第一行有7個符號
test.triangleSolve();//解決問題
return 0;
}