Вместо того, чтобы сканировать каждую строку на 1 и рисовать каждую клетку, Вы могли бы "ходить" по стенам.
пока не в конце вашего массива bool:
- Сканирование, пока не найдете 1
определить функцию с именем "Draw", которая будет:
- Нарисуйте каждый соседний 0 (или за его пределами) в виде стены
- Измените текущее значение 1 на 3 (для этого потребуется использовать что-то отличное от массива bools)
- Переключение текущего курсора на соседний 1
- Если таких соседей нет, вернитесь из Draw. стены.
- при возврате возобновить сканирование, пока не будет найден следующий 1 или конец ввода.
Возможно, не самый эффективный, но вы сказали элегантно. Рекурсия всегда элегантна! (пока вы не получите переполнение стека).
Вот некоторый взломанный код (не используйте магические числа, как я :)), чтобы помочь вам:
int inputIdxToOutputIdx(int idx)
{
return (idx + 1);
}
int draw(int x, int y, int arr[6][6], char outBuff[8][8])
{
for (int deltaX = -1; deltaX < 2; ++deltaX)
{
for (int deltaY = -1; deltaY < 2; ++deltaY)
{
int currX = (x + deltaX);
int currY = (y + deltaY);
int drawX = inputIdxToOutputIdx(x) + deltaX;
int drawY = inputIdxToOutputIdx(y) + deltaY;
// if any adjacent to 1 are 0 or off the map,
// draw a border
arr[x][y] = 3;
if (currX > 5 || currY > 5 || currX < 0 || currY < 0 || arr[currX][currY] == 0)
{
printf("Drawing at %i, %i (%i,%i)\n", currX, currY,drawX,drawY);
outBuff[drawX][drawY] = '*';
}
else if (arr[x][y] == 1)
{
draw(currX, currY, arr, outBuff);
}
}
}
}
// make the output buffer size of input + 2
int printMaze(int arr[6][6], char outBuff[8][8])
{
for (int x = 0; x < 6; ++x)
{
for (int y = 0; y < 6; ++y)
{
// this might be able to be made more efficient.
if (arr[x][y] == 1)
{
draw(x, y, arr, outBuff);
}
}
}
}
В приведенном выше решении я просто рисую '*' '. Однако, если бы вы хотели нарисовать конкретную фигуру для данной ситуации, я бы использовал таблицу поиска, такую как walkytalky в своем комментарии. Сопоставьте заданный набор смежных 1 и 0 с заданным фрагментом. IE:
Глядя вверх:
0 1 0
0 1 1
0 1 0
даст результат "Т" для центральной части стены. Обязательно относитесь к «вне карты» как к эквивилланту до 0.
Когда все сказано и сделано, простое сканирование с таблицей подстановки, основанной на смежных фрагментах (без рекурсии), может быть вашим лучшим выбором, если вы не сможете сделать вышеупомянутое решение более умным, чтобы не пересматривать то, что уже отсканировано.