Open2

"ABC" と {'A', 'B', 'C'}

AAA, AAB, AAC, ABA, ABB, ...

みたいな記号の組み合わせを出力する方法を考えいたときに、再帰関数を適当に実装していたら、なんかおかしなことになった。

(1)最初の実装

#include <bits/stdc++.h>
using namespace std;

void buildArr(set<string> &res, const string& buf, int limit) {
    if (buf.length() == limit) {
        res.insert(buf);
        return;
    }
    for (char c: "ABC") {
        buildArr(res, buf + c, limit);
    }
}

int main() {

    int N = 3;
    set<string> res;
    buildArr(res, "",  N);
    
    // print each str
    for (const auto& s: res) {
        cout << s << endl;
    }

    return 0;
}

https://paiza.io/projects/Oex71q9NOhyyV6IEB8Mdkg

(2)修正後

#include <bits/stdc++.h>
using namespace std;

void buildArr(set<string> &res, const string& buf, int limit) {
    if (buf.length() == limit) {
        res.insert(buf);
        return;
    }
    for (char c: {'A', 'B', 'C'}) {
        buildArr(res, buf + c, limit);
    }
}

int main() {

    int N = 3;
    set<string> res;
    buildArr(res, "",  N);
    
    // print each str
    for (const auto& s: res) {
        cout << s << endl;
    }

    return 0;
}

https://paiza.io/projects/NRZKPROeKyVoXAeNtRlC2g

気になった点

(1)だと長さ3ではない文字列まで拾ってしまっている。

for (char c: "ABC") 

という書き方に問題が有ると思われるけど、原因はまだわからない

デバッガで確認すると、(1)のケースで、2文字なのに長さ3という扱いを受ける場合がある模様

ログインするとコメントできます