Я ковырялся в способе печати номеров из этой проблемы. Я использовал рисование символов расширенный ASCII чтобы проверить это, я понимаю, что это ограничивает область, в которой будет компилироваться мой код.
Краткое объяснение проблемы, если вы не хотите читать там:
Комната определяется как 4-битное целое число, такое что
Например, комната, представленная 0b1101 будет иметь западную, северную и южную стены:
┌─
│
└─
Есть дополнительные ограничения:
numeric_limits<int>::max()
номераМоя проблема — выбор символа пересечения. Мой алгоритм перебора должен иметь доступ к каждой комнате дважды (за исключением комнат в первом ряду / столбце.) Есть ли способ найти пересечения только с одним доступом к памяти на комнату?
Если вы хотите увидеть мой код для справки; это принимает в:
vector<char>
информации о комнатеsize_t
давая ширину рядаvector<int>
с метками для каждой комнаты (это может быть установлено vector(size(testValues), -17)
просто напечатать структуру комнаты без метокstring printArray(const vector<char>& testValues, const size_t width, const vector<int>& indexes) {
if (empty(testValues)) {
return string();
} else {
string result;
auto prevLine = "\xC9\xCD"s;
prevLine.reserve(2U * (1U + width));
for (auto i = 0U; i + 1 < width; ++i) {
if ((testValues[i] & 0b10) != 0) {
prevLine += "\xD1\xCD"s;
} else {
prevLine += "\xCD\xCD"s;
}
}
prevLine += "\xBB\n"s;
result.reserve(size(prevLine) * (1U + 2U * size(testValues) / width));
for (auto i = 0U; i < size(testValues) - width; ++i) {
const auto x = i % width;
const auto isBottomSet = (testValues[i] & 0b1) != 0;
if (x == 0) {
result += (prevLine + '\xBA') + static_cast<char>('0' + indexes[i]);
prevLine = isBottomSet ? "\xC7\xC4"s : "\xBA "s;
}
if (x + 1U == width) {
result += "\xBA\n"s;
prevLine += isBottomSet ? "\xB6\n"s : "\xBA\n"s;
} else {
const auto isRightSet = (testValues[i] & 0b10) != 0;
const size_t index = static_cast<int>(isRightSet) << 3 | testValues[i + width + 1] & 0b100 | (testValues[i + width + 1] & 0b1000) >> 2 | static_cast<int>(isBottomSet);
// MSB: isAboveIntersectionSet
// isRightOfIntersectionSet
// isBelowIntersectionSet
// LSB: isLeftOfIntersectionSet
constexpr const char* getIntersection[] = { " ", // 0b0
" ", // 0b1
" ", // 0b10
"\xBF ", // 0b11
" \xC4", // 0b100
"\xC4\xC4", // 0b101
"\xDA\xC4", // 0b110
"\xC2\xC4", // 0b111
" ", // 0b1000:
"\xD9 ", // 0b1001
"\xB3 ", // 0b1010
"\xB4 ", // 0b1011
"\xC0\xC4", // 0b1100
"\xC1\xC4", // 0b1101
"\xC3\xC4", // 0b1110
"\xC5\xC4" }; // 0b1111
result += { isRightSet ? '\xB3' : ' ', static_cast<char>('0' + indexes[i + 1]) };
prevLine += getIntersection[index];
}
}
result += (prevLine + '\xBA') + static_cast<char>('0' + indexes[size(testValues) - width]);
prevLine = "\xC8\xCD"s;
for (auto i = size(testValues) - width; i + 1 < size(testValues); ++i) {
if ((testValues[i] & 0b10) != 0) {
result += { '\xB3', static_cast<char>('0' + indexes[i + 1]) };
prevLine += "\xCF\xCD"s;
} else {
result += { ' ', static_cast<char>('0' + indexes[i + 1]) };
prevLine += "\xCD\xCD"s;
}
}
return result + "\xBA\n"s + prevLine + '\xBC';
}
}
Если вы заинтересованы в простом тесте для этого, вы можете сделать:
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 vector<int> indexes = { 1, 1, 2, 2, 3, 3, 3,
1, 1, 1, 2, 3, 5, 3,
1, 1, 1, 6, 3, 6, 3,
1, 6, 6, 6, 6, 6, 3 };
cout << printArray(rooms, width, indexes) << endl;
Чтобы запустить это, вам нужно перейти к http://webcompiler.cloudapp.net/ и вставьте все в.
Задача ещё не решена.
Других решений пока нет …