[Luogu /再帰]ニワトリ(末尾再帰に複数のループ)

問題の説明:

タイトル説明

豚ハンケ特にローストチキンを食べるのが好き(これは同じ獣はfratricidal、です!)ハンケ鶏は非常に特別である。なぜ特別な?彼は10の成分(などマスタード、クミンなど)を持っているので、あなたはどんな食材の品質の、すべてのために、各成分1-3グラム、おいしい鶏の範囲を置くことができます

プログラムと今、ハンケが知りたい、あなたはおいしい度を与えている場合、してください出力これらすべての10の成分

入力形式

行、N <= 5000

出力フォーマット

最初の行、プログラムの総数

2行目の末尾に、数10は、各成分の品質の放出を示し

辞書式順序によります。

出力の1行目に限り、「0」としての要件を満たすために方法はありません場合

サンプル入力と出力

入力#1

11

出力#1

10 
1 1 1 1 1 1 1 1 1 2 
1 1 1 1 1 1 1 1 2 1 
1 1 1 1 1 1 1 2 1 1 
1 1 1 1 1 1 2 1 1 1 
1 1 1 1 1 2 1 1 1 1 
1 1 1 1 2 1 1 1 1 1 
1 1 1 2 1 1 1 1 1 1 
1 1 2 1 1 1 1 1 1 1 
1 2 1 1 1 1 1 1 1 1 
2 1 1 1 1 1 1 1 1 1

説明/ヒント

列挙

基本的な考え方:

営巣のための一見10で、できるだけで本当にそう?それは100、1000サイクルことですか?Iゴミ!

しかし、私が知っている他の人のコードを読んで、メタプログラミングソリューションを考えていませんでした。

つまり、末尾再帰ループの方法を使用して、相互に変換することができます-私たちの複数のループは、末尾再帰にそして、再帰的ループ内にネスト!

ACコード:

#include<bits/stdc++.h>
using namespace std;
// include<bits/stdc++.h>
// using namespace std 然后你就准备ambigous把

int a[15];
int result[10000][15];
int target = 0;
int count_ = 0;

void Turkey(int sum, int n) {
// n代表配料的编号
  if (n == 10) {
    if (sum == target) {
      for (int i = 0; i < 10; ++i) {
        result[count_][i] = a[i]; 
      }
      ++count_;
    }
    return;
  } 
  for (int i = 1; i <= 3; ++i) {
    a[n] = i;
    // cout << sum << endl;
    Turkey(sum + i, n + 1);   // 这里不需要修改sum,直接传表达式即可
  }
}

int main() {
  cin >> target;
  Turkey(0, 0);
  cout << count_ << endl;
  for (int i = 0; i < count_; ++i) {
    for (int j = 0; j < 10; ++j) {
      cout << result[i][j] << " ";
    }
    cout << endl;
  }
  return 0;
}

その他の経験:

コメントの一つとして言った - #は、名前空間stdを使用して、あなたは、コンパイラのエラーレポート不明瞭プットを待つ<++ビット/ STDC時間。>!

公開された137元の記事 ウォン称賛19 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_43338695/article/details/102878226