weinan030416

导航

续排列问题

递归求字符全排列 - 楠030416 - 博客园 (cnblogs.com)

 

每一个人心中都有一个林克。每一个林克都不一样。在命运矩阵里面,随着选择的不同,没有哪一个林克的命运会一模一样。

有一个方格型的命运矩阵,矩阵边界在无穷远处。我们做如下假设:

1. 每一个格子象征林克命运中的一次抉择,每次只能从相邻的方格中做选择。

2. 从某个格子出发,只能从当前方格移动一格,走到某个相邻的方格上;

3.选择一旦做出就不可更改,因此走过的格子无法走第二次。

4. 从命运矩阵的第1行出发,只能向下、左、右三个方向走;

请问:如果最高允许在方格矩阵上走n步(也就是林克一生最多能做n个选择)。
那么随着n的不同,请问一共会有多少种不同选择的方案导致多少个不同的林克?
注意,2种走法只要有一步不一样,即被认为是不同的方案。

 

输入

 

允许在方格上行走的步数n(n <= 20)

 

输出

 

经过n个选择之后,诞生的不同的林克的个数。

 

输入样例 1 

2

输出样例 1

7

输入样例 2 

20

输出样例 2

54608393


#include<iostream>
#include<cstring>
using namespace std;

bool fate[100][100];
int dx[3]={1,-1,0},dy[3]={0,0,1};


int dfs(int i,int j,int n)
{
    if(n==0)    return 1;
    int res=0;
    fate[i][j]=true;
    for(int k=0;k<3;k++)
    {
        int x=i+dx[k],y=j+dy[k];
        if(!fate[x][y])    res+=dfs(x,y,n-1);
    }
    fate[i][j]=false;
    return res;
}

int main()
{
    int t;
    cin>>t;
    cout<<dfs(50,0,t);
}

 

posted on 2023-01-31 12:39  楠030416  阅读(26)  评论(0编辑  收藏  举报