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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章