1. 程式人生 > >WaWa的難題

WaWa的難題

題目描述

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);
    }
}