幸運三角形
- 描述
-
話說有這麼一個圖形,只有兩種符號組成(‘+’或者‘-’),圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外(第一層爲所有可能情況),每層形狀都由上層決定,相鄰的符號相同,則下層的符號爲‘+’,反之,爲‘-’;如下圖所示(n = 3 時的兩種情況):
如果圖中的兩種符號個數相同,那這個三角形就是幸運三角形,如上圖中的圖(2).
- 輸入
-
有多組測試數據(少於20組)。
每行含一個整數n(0<n<20)。 - 輸出
- 輸出相應的幸運三角形個數。
- 樣例輸入
-
3 4
- 樣例輸出
-
4 6
思路: 用dfs來構造第一層,然後由上一層一次推出下一層。。。找出0<n<20的所有結果,然後打表輸出。
代碼:
#include<stdio.h> #include<string.h> char str[25]; char ans[25]; bool vis[25]; int count; int n; void caculate(int t) { int suma,sumb; suma=0;sumb=0; strcpy(str,ans); while(t) { for(int i=0;i<t;i++) { if(str[i]=='+') suma++; if(str[i]=='-') sumb++; } // for(int i=0;i<t;i++)printf("%c",str[i]); // printf(" \nsuma=%d sumb=%d\n",suma,sumb); for(int i=0;i<t;i++) { if(str[i]==str[i+1]) str[i]='+'; else str[i]='-'; } t--; } if(suma==sumb&&suma!=0) count++; } void dfs(int num)//構造第一層 { if(num==n) { // printf("ans= %s\n",ans); caculate(n);//計算+,- return ; } if(!vis[num]) { vis[num]=true; ans[num]='+'; dfs(num+1); ans[num]='-'; dfs(num+1); vis[num]=false; } } int main() { //while(~scanf("%d",&n)) for(int i=0;i<20;i++) { n=i; memset(vis,false,sizeof(vis)); count=0; dfs(0); printf("%d,",count); } }
#include<stdio.h> int main() { int n; int ans[]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757}; while(~scanf("%d",&n)) { printf("%d\n",ans[n]); } }