8.1質問E:[再帰の概要]ポップシーケンスの統計

タイトル説明

スタックは一般的に使用されるデータ構造です。スタックの最上部で要素がスタックにプッシュされるのを待機させるためのnがあり、スタックの最上部の反対側はポップシーケンスです。スタック操作には、プッシュとポップの2つがあることは既にご存知でしょう。前者は要素をスタックにプッシュすることであり、後者はスタックの最上位の要素をポップすることです。これらの2つの操作を使用するために、一連の出力シーケンスを1つの操作シーケンスから取得できます。与えられたnを見つけ、一連の操作の後にオペランドシーケンス1、2、...、nから取得できる出力シーケンスの総数を計算して出力するようにプログラムしてください。
 

入る

整数n(1 <= n <= 15) 

出力

整数、可能な出力シーケンスの総数。

サンプル入力コピー

3

サンプル出力コピー

5

促す

まず、スタックの2つの基本的な操作を理解します。プッシュとは、要素をスタックの一番上に配置し、スタックの一番上のポインターを1つ上に移動し、待機キューも1つ上に移動することです。ポップスタックの一番上に要素をポップすると同時に、スタックの一番上のポインタが1つ下に移動します。 
プロセスを使用して、スタックに出入りするプロセスをシミュレートします。バックトラックは、ループと再帰によって実現できます。スタックにプッシュできる場合はこのプロセスを繰り返し、ポップできる場合は要素を入力します。要素が出ています。1つずつ試して、ポップされた要素の数がnに達したときに1回カウントします(これは再帰呼び出しの終了の条件でもあります)。 

#include <iostream>
#include <cstdio>
using namespace std;
int n,ans;
void dfs(int in,int out)
{
    if(out==0) ans++;
    else if(in==0){
        dfs(in+1,out-1);//进栈
    }
    else{
        dfs(in+1,out-1);//进栈
        dfs(in-1,out);//出栈
    }
 
}
int main()
{
    while(scanf("%d",&n)!=EOF){
        ans=0;
        dfs(0,n);
        printf("%d\n",ans);
    }
    return 0;
}

 

おすすめ

転載: blog.csdn.net/wangws_sb/article/details/114931159