#include <algorithm>
#include <iostream>
#include <limits>
#include <vector>
using namespace std;
bool generate(vector<int>& temp, int& target, const size_t width, const size_t i) {
const auto replacement = temp[i];
const auto result = target > replacement;
if (result) {
for_each(begin(temp), next(begin(temp), min(temp.size(), i + width - 1)), [=](auto& it) {
if (target == it) {
it = replacement;
} else if (target < it) {
--it;
} });
}
target = replacement;
return result;
}
int main() {
const vector<char> rooms = { 0b1101, 0b110, 0b1101, 0b110, 0b1100, 0b101, 0b110,
0b1110, 0b1001, 0b110, 0b1011, 0b1010, 0b1111, 0b1010,
0b1000, 0b101, 0b11, 0b1110, 0b1011, 0b1110, 0b1010,
0b1011, 0b1101, 0b101, 0b1, 0b101, 0b11, 0b1011 };
const size_t width = 7U;
auto result = 0;
vector<int> temp(rooms.size());
for (size_t i = 0U; i < rooms.size(); ++i) {
const auto toWest = (rooms[i] & 0b1000) == 0;
const auto toNorth = (rooms[i] & 0b100) == 0;
const auto toEast = (rooms[i] & 0b10) == 0;
const auto toSouth = (rooms[i] & 0b1) == 0;
const auto west = toWest && temp[i - 1] != 0 ? temp[i - 1] : numeric_limits<int>::max();
const auto north = toNorth && temp[i - width] != 0 ? temp[i - width] : numeric_limits<int>::max();
const auto east = toEast && temp[i + 1] != 0 ? temp[i + 1] : numeric_limits<int>::max();
temp[i] = min({ temp[i] != 0 ? temp[i] : numeric_limits<int>::max(), result + 1, west, north, east });
if (temp[i] == result + 1) ++result;
if (toWest) result -= generate(temp, temp[i - 1], width, i);
if (toNorth) result -= generate(temp, temp[i - width], width, i);
if (toEast) result -= generate(temp, temp[i + 1], width, i);
if (toSouth) temp[i + width] = temp[i];
}
for (auto it = cbegin(temp); it != cend(temp);) {
for (auto i = 0; i < width; ++i, ++it) cout << *it << '\t';
cout << endl;
}
cout << endl << result << endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bGltaXRzPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmJvb2wgZ2VuZXJhdGUodmVjdG9yPGludD4mIHRlbXAsIGludCYgdGFyZ2V0LCBjb25zdCBzaXplX3Qgd2lkdGgsIGNvbnN0IHNpemVfdCBpKSB7Cgljb25zdCBhdXRvIHJlcGxhY2VtZW50ID0gdGVtcFtpXTsKCWNvbnN0IGF1dG8gcmVzdWx0ID0gdGFyZ2V0ID4gcmVwbGFjZW1lbnQ7CgoJaWYgKHJlc3VsdCkgewoJCWZvcl9lYWNoKGJlZ2luKHRlbXApLCBuZXh0KGJlZ2luKHRlbXApLCBtaW4odGVtcC5zaXplKCksIGkgKyB3aWR0aCAtIDEpKSwgWz1dKGF1dG8mIGl0KSB7CgkJCWlmICh0YXJnZXQgPT0gaXQpIHsKCQkJCWl0ID0gcmVwbGFjZW1lbnQ7CgkJCX0gZWxzZSBpZiAodGFyZ2V0IDwgaXQpIHsKCQkJCS0taXQ7CgkJCX0gfSk7Cgl9Cgl0YXJnZXQgPSByZXBsYWNlbWVudDsKCXJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKCkgewoJY29uc3QgdmVjdG9yPGNoYXI+IHJvb21zID0geyAwYjExMDEsCTBiMTEwLAkwYjExMDEsCTBiMTEwLAkwYjExMDAsCTBiMTAxLAkwYjExMCwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMGIxMTEwLAkwYjEwMDEsCTBiMTEwLAkwYjEwMTEsCTBiMTAxMCwJMGIxMTExLAkwYjEwMTAsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBiMTAwMCwJMGIxMDEsCTBiMTEsCTBiMTExMCwJMGIxMDExLAkwYjExMTAsCTBiMTAxMCwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMGIxMDExLAkwYjExMDEsCTBiMTAxLAkwYjEsCTBiMTAxLAkwYjExLAkwYjEwMTEgfTsKCWNvbnN0IHNpemVfdCB3aWR0aCA9IDdVOwoJYXV0byByZXN1bHQgPSAwOwoJdmVjdG9yPGludD4gdGVtcChyb29tcy5zaXplKCkpOwoKCWZvciAoc2l6ZV90IGkgPSAwVTsgaSA8IHJvb21zLnNpemUoKTsgKytpKSB7CgkJY29uc3QgYXV0byB0b1dlc3QgPSAocm9vbXNbaV0gJiAwYjEwMDApID09IDA7CgkJY29uc3QgYXV0byB0b05vcnRoID0gKHJvb21zW2ldICYgMGIxMDApID09IDA7CgkJY29uc3QgYXV0byB0b0Vhc3QgPSAocm9vbXNbaV0gJiAwYjEwKSA9PSAwOwoJCWNvbnN0IGF1dG8gdG9Tb3V0aCA9IChyb29tc1tpXSAmIDBiMSkgPT0gMDsKCQljb25zdCBhdXRvIHdlc3QgPSB0b1dlc3QgJiYgdGVtcFtpIC0gMV0gIT0gMCA/IHRlbXBbaSAtIDFdIDogbnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CgkJY29uc3QgYXV0byBub3J0aCA9IHRvTm9ydGggJiYgdGVtcFtpIC0gd2lkdGhdICE9IDAgPyB0ZW1wW2kgLSB3aWR0aF0gOiBudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKCQljb25zdCBhdXRvIGVhc3QgPSB0b0Vhc3QgJiYgdGVtcFtpICsgMV0gIT0gMCA/IHRlbXBbaSArIDFdIDogbnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CgoJCXRlbXBbaV0gPSBtaW4oeyB0ZW1wW2ldICE9IDAgPyB0ZW1wW2ldIDogbnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCksIHJlc3VsdCArIDEsIHdlc3QsIG5vcnRoLCBlYXN0IH0pOwoKCQlpZiAodGVtcFtpXSA9PSByZXN1bHQgKyAxKSArK3Jlc3VsdDsKCgkJaWYgKHRvV2VzdCkgcmVzdWx0IC09IGdlbmVyYXRlKHRlbXAsIHRlbXBbaSAtIDFdLCB3aWR0aCwgaSk7CgkJaWYgKHRvTm9ydGgpIHJlc3VsdCAtPSBnZW5lcmF0ZSh0ZW1wLCB0ZW1wW2kgLSB3aWR0aF0sIHdpZHRoLCBpKTsKCQlpZiAodG9FYXN0KSByZXN1bHQgLT0gZ2VuZXJhdGUodGVtcCwgdGVtcFtpICsgMV0sIHdpZHRoLCBpKTsKCQlpZiAodG9Tb3V0aCkgdGVtcFtpICsgd2lkdGhdID0gdGVtcFtpXTsKCX0KCglmb3IgKGF1dG8gaXQgPSBjYmVnaW4odGVtcCk7IGl0ICE9IGNlbmQodGVtcCk7KSB7CgkJZm9yIChhdXRvIGkgPSAwOyBpIDwgd2lkdGg7ICsraSwgKytpdCkgY291dCA8PCAqaXQgPDwgJ1x0JzsKCQljb3V0IDw8IGVuZGw7Cgl9CgoJY291dCA8PCBlbmRsIDw8IHJlc3VsdCA8PCBlbmRsOwp9
prog.cpp: In instantiation of 'generate(std::vector<int>&, int&, size_t, size_t)::<lambda(auto:1&)> [with auto:1 = int]':
/usr/include/c++/5/bits/stl_algo.h:3767:5: required from '_Funct std::for_each(_IIter, _IIter, _Funct) [with _IIter = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _Funct = generate(std::vector<int>&, int&, size_t, size_t)::<lambda(auto:1&)>]'
prog.cpp:18:7: required from here
prog.cpp:15:8: internal compiler error: Segmentation fault
it = replacement;
^
0x8699cca crash_signal
../../src/gcc/toplev.c:383
0x82f9748 maybe_constant_init(tree_node*, tree_node*)
../../src/gcc/cp/constexpr.c:3843
0x8226605 tsubst_copy
../../src/gcc/cp/pt.c:13114
0x8217f03 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool)
../../src/gcc/cp/pt.c:15705
0x821917c tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool)
../../src/gcc/cp/pt.c:15033
0x821fde7 tsubst_expr
../../src/gcc/cp/pt.c:14530
0x821eee1 tsubst_expr
../../src/gcc/cp/pt.c:13941
0x821fdac tsubst_expr
../../src/gcc/cp/pt.c:14113
0x821f153 tsubst_expr
../../src/gcc/cp/pt.c:14093
0x821fdac tsubst_expr
../../src/gcc/cp/pt.c:14113
0x821f672 tsubst_expr
../../src/gcc/cp/pt.c:13927
0x821fdac tsubst_expr
../../src/gcc/cp/pt.c:14113
0x821eaac instantiate_decl(tree_node*, int, bool)
../../src/gcc/cp/pt.c:20543
0x824c1a3 mark_used(tree_node*, int)
../../src/gcc/cp/decl2.c:5032
0x81eef12 build_over_call
../../src/gcc/cp/call.c:7501
0x81f1309 build_op_call_1
../../src/gcc/cp/call.c:4345
0x81f1309 build_op_call(tree_node*, vec<tree_node*, va_gc, vl_embed>**, int)
../../src/gcc/cp/call.c:4368
0x82b23fa finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool, bool, int)
../../src/gcc/cp/semantics.c:2426
0x8219406 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool)
../../src/gcc/cp/pt.c:15343
0x821fde7 tsubst_expr
../../src/gcc/cp/pt.c:14530
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <file:///usr/share/doc/gcc-5/README.Bugs> for instructions.