m3908714035 さんが書きました: ↑6年前
コード全体としては完成していませんが、下記のコードで動かしました。
次ように書いても、main の temporary_permutation には同じ値が入ります。
コード:
void align(std::string &_s, int i)
{
_s = std::string(i, '1') + std::string(i, '0');
}
void permutate(std::vector<int> &_vi, std::string s)
{
do {
_vi.push_back(stoi(s, nullptr, 2));
} while (prev_permutation(s.begin() + 1, s.end()));
}
同じ値なので align や permutate は元のままでもかまいません。
しかし、search の中身がさっぱり理解できません。
conceivavle_gap とは何でしょうか?
今、i = 6 で試しているようなので、i * 2 は 12 で、
その約数で、1 と 12 でない { 2, 3, 4, 6 } が入りますね。
そのあとはさっぱりわかりません。
ところで、string を stoi で 2進数にするいうアイデアを
頂戴し、次のようなコードが書いてみました。
コード:
#include <iostream>
#include <map>
#include <string> // stoi
#include <algorithm> // prev_permutation
using namespace std;
int main()
{
map<int, bool> mib;
int i;
cout << "i = ", cin >> i;
string s = string(i, '1') + string(i, '0');
i *= 2;
int m = (1 << i) - 1;
do {
int k = 0, b = stoi(s, nullptr, 2);
while (k < i && mib.find((b>>k | b<<(i - k)) & m) == mib.end()) k++;
if (k == i) cout << s << endl, mib[b] = true;
} while (prev_permutation(s.begin() + 1, s.end()));
}
実行例
コード:
i = 4
11110000
11101000
11100100
11100010
11011000
11010100
11010010
11001100
11001010
10101010
これは、string を使う次のコードよりずいぶん速くなります。
コード:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // prev_permutation
using namespace std;
int main()
{
vector<string> vs;
int i;
cout << "i = ", cin >> i;
string s = string(i, '1') + string(i, '0');
do {
string t = s + s;
auto it = vs.begin();
while (it != vs.end() && t.find(*it) == string::npos) ++it;
if (it == vs.end()) cout << s << endl, vs.push_back(s);
} while (prev_permutation(s.begin() + 1, s.end()));
}