NYOJ491幸運三角形

2021-08-07 04:45:37 字數 1909 閱讀 8352

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3 描述

話說有這麼乙個圖形,只有兩種符號組成(『+』或者『-』),圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外(第一層為所有可能情況),每層形狀都由上層決定,相鄰的符號相同,則下層的符號為『+』,反之,為『-』;如下圖所示(n = 3 時的兩種情況):

如果圖中的兩種符號個數相同,那這個三角形就是幸運三角形,如上圖中的圖(2).

輸入

有多組測試資料(少於20組)。

每行含乙個整數n(0輸出

輸出相應的幸運三角形個數。

樣例輸入

3

4

樣例輸出

4

6

/*#include #include #include int n, cnt; 

int a[25];

int check()//每次總是覺得這個check函式是最難得

} }

if(t1 == t0)

return 1;

return 0;

} void dfs(int x)

a[x] = 1;//這裡並沒有往常一樣有if判斷了,而是直接深搜了

dfs(x + 1);

a[x] = 0;//這裡回溯回來的時候繼續深搜下去,思路還是比較清晰的

dfs(x + 1);

} int main()

return 0;

} */ 打表

#include int a[21] = ;//打表最好不要用for迴圈

int main()

return 0;

}

#include"iostream"  

#include#include#includeusing namespace std;

typedef unsigned char uchar;

char cc[2]=; //便於輸出

int n, //第一行符號總數

half, //全部符號總數一半

counter; //1計數,即「-」號計數

char **p; //符號儲存空間

long sum; //符合條件的三角形計數

//t,第一行第t個符號

void backtrace(int t)

if( (counter <= half) && ( t*(t+1)/2 - counter <= half) )//若符號統計未超過半數,並且另一種符號也未超過半數

backtrace(t+1); //在第一行增加下乙個符號

//回溯,判斷另一種符號情況

for(j=2; j<=t; ++j)

counter -= p[j][t-j+1];

counter -= i;

} }

int main()

backtrace(1);

}

printf("%d\n", sum);}

return 0;

}

程式用乙個t表示第一行中n個數中的第幾個數,用第一重迴圈來賦值n個數的0或1值。然後再用一重迴圈,不斷去更新每行未更新的。因為t不斷加1,j每次都是從2開始,所以當t增大,當到j行時,明顯j每次只是重複2-t之中,所以這樣就實現了當第一行每增加乙個數,都能補全為乙個三角形了。

nyoj491幸運三角形

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 話說有這麼乙個圖形,只有兩種符號組成 或者 圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外 第一層為所有可能情況 每層形狀都由上層決定,相鄰的符號相同,則下層的符號為 反之,為 如下圖所示 n 3 時...

NYOJ 491 幸運三角形

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 話說有這麼乙個圖形,只有兩種符號組成 或者 圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外 第一層為所有可能情況 每層形狀都由上層決定,相鄰的符號相同,則下層的符號為 反之,為 如下圖所示 n 3 時...

nyoj 491 幸運三角形(dfs)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述話說有這麼乙個圖形,只有兩種符號組成 或者 圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外 第一層為所有可能情況 每層形狀都由上層決定,相鄰的符號相同,則下層的符號為 反之,為 如下圖所示 n 3 時的...