WaWa的難題
阿新 • • 發佈:2019-01-04
題目描述
HaHa和WaWa是好朋友,他們在臨近期末的這段時間一起宅在圖書館學習。
今天HaHa在書上看到一個排列組合題目,思考很久後,仍然找不出其中的規律。
於是他把題目敘述給了WaWa。
題目:
————————————————————————
一個長度為N的排列,由數字1~N組成,它滿足兩個條件。
1、數字1永遠在第一位。
2、任意兩個相鄰數字之差小於等於2。
現在給出一個N,
你能知道能組成多少個符合條件的排列嗎?。
例如:
N=4
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
所以答案為4
————————————————————————
WaWa聽後也是一臉懵逼。
現在WaWa想求助於你們,WaWa給出一個正整數N,問你用1~N能組成多少個符合題意的排列。
輸入
多組資料。
每組資料輸入一個正整數N(1<=N<=100)。
輸出
輸出符合題意的排列個數
樣例輸入 Copy
2
4
樣例輸出 Copy
1
4
分析:
本題的基本思路是dfs,不過時間超限。但我們運用dfs看結果的時候會發現規律。
#include"stdio.h" #include"string.h" int main() { long long a[101]; long long i,j,k; long long N; a[1]=1;a[2]=1;a[3]=2; for(i=4;i<101;i++) a[i]=a[i-1]+a[i-3]+1; while(~scanf("%lld",&N)) { printf("%lld\n",a[N]); } }
BFS程式碼:
#include"stdio.h" #include"string.h" long long count; long long vis[101]; long long a[101],N; void dfs(long long mark) { int i,j,k; if(mark==N+1) {count++; } else { for(i=2;i<=N;i++) {//注意題目,是差,並未說誰大。 if(vis[i]==1&&abs(i-a[mark-1])<=2) { vis[i]=0; a[mark]=i; dfs(mark+1); vis[i]=1; } } } } int main() { long long i; while(~scanf("%lld",&N)) { for(i=1;i<=N;i++) vis[i]=1; a[1]=1; count=0; dfs(2); printf("%lld\n",count); } }