天天看點

nyoj——469 擅長排列的小明 II

擅長排列的小明 II

時間限制: 1000 ms  |  記憶體限制: 65535 KB 難度: 3

描述

小明十分聰明,而且十分擅長排列計算。

有一天小明心血來潮想考考你,他給了你一個正整數n,序列1,2,3,4,5......n滿足以下情況的排列:

1、第一個數必須是1

2、相鄰兩個數之差不大于2

你的任務是給出排列的種數。

輸入
多組資料。每組資料中輸入一個正整數n(n<=55).
輸出
輸出種數。
樣例輸入
4      
樣例輸出
4
規律題

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<math.h>

#include<ctype.h>

#include<stdlib.h>

#include<string>

#include<algorithm>

#include<vector>

#include<set>

#include<map>

#include<list>

#include<queue>

#include<stack>

#include<iomanip>

#include<numeric>

#include <istream>     //基本輸入流

#include <ostream>     //基本輸出流

#include <sstream>     //基于字元串的流

#include <utility>     //STL 通用模闆類

#include <complex.h>   //複數處理

#include <fenv.h>    //浮點環境

#include <inttypes.h>  //整數格式轉換

#include <stdbool.h>   //布爾環境

#include <stdint.h>   //整型環境

#include <tgmath.h>   //通用類型數學宏

#define L(a,b,c) for(int a = b;a >= c;a --)

#define M(a,b,c) for(int a = b;a < c;a ++)

#define N(a,b) memset(a,b,sizeof(a));

const int MAX=100000000;

const int MIN=-MAX;

typedef int T;

typedef double D;

typedef char C;

using namespace std;

int main()

{

    int n,a[100]={0,1,1,2,4};

    M(i,5,60)

    a[i]=a[i-1]+a[i-3]+1;

    while(~scanf("%d",&n))

        printf("%d\n",a[n]);

    return 0;

}

深搜的話就會逾時了

#include<iostream>

#include<stdio.h>

#include<string.h>

#include<math.h>

#include<ctype.h>

#include<stdlib.h>

#include<string>

#include<algorithm>

#include<vector>

#include<set>

#include<map>

#include<list>

#include<queue>

#include<stack>

#include<iomanip>

#include<numeric>

#include <istream>     //基本輸入流

#include <ostream>     //基本輸出流

#include <sstream>     //基于字元串的流

#include <utility>     //STL 通用模闆類

#include <complex.h>   //複數處理

#include <fenv.h>    //浮點環境

#include <inttypes.h>  //整數格式轉換

#include <stdbool.h>   //布爾環境

#include <stdint.h>   //整型環境

#include <tgmath.h>   //通用類型數學宏

#define L(a,b,c) for(int a = b;a >= c;a --)

#define M(a,b,c) for(int a = b;a < c;a ++)

#define N(a,b) memset(a,b,sizeof(a));

const int MAX=100000000;

const int MIN=-MAX;

typedef int T;

typedef double D;

typedef char C;

using namespace std;

int a[60],b[100],n,sum;

void dfs(int num)

{

    if(num==n)

    {

        sum++;

        return ;

    }

    else

    {

        for(int i=2; i<=n; i++)

            if(!b[i]&&abs(i-a[num-1])<=2)

            {

                b[i]=1;

                a[num]=i;

                dfs(num+1);

                b[i]=0;

            }

    }

}

int main()

{

    while(cin>>n)

    {

        N(a,0)

        N(b,0)

        a[0]=1;

        sum=0;

        dfs(1);

        cout<<sum<<endl;

    }

    return 0;

}

繼續閱讀