時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:3 描述
話說有這麼乙個圖形,只有兩種符號組成(『+』或者『-』),圖形的最上層有n個符號,往下個數依次減一,形成倒置的金字塔形狀,除第一層外(第一層為所有可能情況),每層形狀都由上層決定,相鄰的符號相同,則下層的符號為『+』,反之,為『-』;如下圖所示(n = 3 時的兩種情況):
如果圖中的兩種符號個數相同,那這個三角形就是幸運三角形,如上圖中的圖(2).
輸入
有多組測試資料(少於20組)。
每行含乙個整數n(0輸出
輸出相應的幸運三角形個數。
樣例輸入
3樣例輸出4
46
/*#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 時的...