DFS——林克的命运之阵

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

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

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

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

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

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

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

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

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

输入样例 1

2
输出样例 1

7
输入样例 2

20
输出样例 2

54608393

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int fate[50][50]={0};
int num=0;
bool isLeft(int i,int j)
{
    return fate[i][j-1]==0;
}
bool isRight(int i,int j)
{
    return fate[i][j+1]==0;
}
int choose(int n,int i,int j)
{
    if(n==0)
    {    
        num++;//一开始应该在fate[0][25]
        return 1;
    }
    fate[i][j]=1;
    if(isLeft(i,j)) 
    {
        choose(n-1,i,j-1);
    }
    if(isRight(i,j))
    {
        choose(n-1,i,j+1);
    }
    choose(n-1,i+1,j);
    fate[i][j]=0;//对于走完的路进行清0;
    return num;
}
int main()
{
    int n;
    cin>>n;
    cout<<choose(n,0,25);
    return 0;
}

也可以

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int fate[50][50]={0};
bool isLeft(int i,int j)
{
    return fate[i][j-1]==0;
}
bool isRight(int i,int j)
{
    return fate[i][j+1]==0;
}
int choose(int n,int i,int j)
{
    if(n==0)
    return 1;
    fate[i][j]=1;
    int num=0;
    //总的数量 = 向三个方向数量的总数之和
    if(isLeft(i,j)) 
        num+=choose(n-1,i,j-1);
    if(isRight(i,j))
        num+=choose(n-1,i,j+1);
   	num+=choose(n-1,i+1,j);
    fate[i][j]=0;
    return num;
}
int main()
{
    int n;
    cin>>n;
    cout<<choose(n,0,25);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章