0

同様の問題を検索して見つけましたが、それらはすべて私のものには合わないようでした。基本的に、ループを N 回ネストし、最後のループだけにすべてを出力する再帰関数を作成する必要があります。問題に対する別の解決策を見つけることができれば、それは素晴らしいことです。

0 = *
1 = +
2 = ABC
3 = DEF
...
8 = STU
9 = VWXYZ

完全なコードは次のとおりです: http://pastebin.com/2YdQ693N

ハードコーディングされた N=3 の例を次に示します。

//sout is a vector<string>

for(int i = 0; i < sout[0].size(); i++)
{
    for(int j = 0; j < sout[1].size(); j++)
    {
        for(int k = 0; k < sout[2].size(); k++)
        {
            cout << sout[0][i] << sout[1][j] << sout[2][k] << endl;
        }
    }
}

この特定の例の次の出力 (入力は「123」):

+AD
+AE
+AF
+BD
+BE
+BF
+CD
+CE
+CF

ここに来る前に得た最も近いものは、http: //v2.cplusplus.com/forum/beginner/68434/に似た再帰関数でしたが、私の場合はうまくいきませんでした。

このタイプの順序でインデックスを作成する必要があります。

000
001
002
010
011
012
020
021
022

ただし、長さは可変でなければなりません (したがって、高さも同様です)。

私がこれまで試してきた再帰関数は次のとおりです。

void recurseLoop(const vector<string>& sout, int numLoops)
{
    if(numLoops > 0)
    {
        for(int i = 0; i < sout[1].size(); i++)
        {
            //cout << i;
            recurseLoop(sout, numLoops - 1);
        }
    }
    else
    {
        //cout << endl;
        return;
    }
}

ただし、「i」が与える結果はほとんど理解できず、これを機能させるためのループ/if ステートメントの正しい構造を取得するのに問題があります。どんな助けでも大歓迎です!

4

2 に答える 2

0
void recursion(int N, const vector<string>&sout, vector<int>&index, int I=0)
{
  if(I<N-1)
    for(index[I]=0; index[I]<sout[I].size(); index[I]++)
      recursion(N,sout,index,I+1);
  else if(I==N-1)
    for(index[I]=0; index[I]<sout[I].size(); index[I]++) {
      for(int k=0; k<N; ++k)
        std::cout << sout[k][index[k]];
      std::cout << std::endl;
    }
}

void loop_N_times(const vector<string>&sout)
{
  std::vector<int> index(sout.size());
  recursion(sout.size(),sout,index,0);
}
于 2013-10-08T18:32:35.830 に答える