Юный программист
решил придумать собственную игру. Игра происходит на поле размером n × n клеток, в некоторых клетках которого расположены города (каждый
город занимает одну клетку; в каждой клетке может располагаться не более одного
города). Всего должно быть чётное количество городов.
Изначально про
каждую клетку игрового поля известно, расположен ли в ней город или нет. Чтобы
начать игру, необходимо разделить игровое поле на два государства так, чтобы в
каждом государстве было поровну клеток-городов.
Граница между
государствами должна проходить по границам клеток таким образом, чтобы из любой
клетки каждого государства существовал путь по клеткам этого же государства в
любую другую его клетку (из клетки можно перейти в соседнюю, если они имеют
общую сторону). Каждая клетка игрового поля должна принадлежать только одному
из двух государств, при этом государства не обязаны состоять из одинакового
количества клеток.
Напишите
программу, которая разделит клетки заданного игрового поля между двумя государствами.
Вход. Первая строка содержит размер игрового поля n (1 ≤ n ≤ 50).
Последующие n строк
содержат по n заглавных латинских
букв (без пробелов), кодирующих соответствующие клетки игрового поля: C
обозначает клетку, занятую городом, D – пустую клетку. Гарантируется, что на
поле есть хотя бы два города и всего их чётное число.
Выход. Вывести n строк по n цифр (без пробелов) в каждой, кодирующих соответствующие клетки.
Цифра 1 обозначает, что данная клетка принадлежит первому государству, цифра 2 –
данная клетка принадлежит второму государству.
Если решений
несколько, необходимо вывести любое из них.
Пример
входа 1 |
Пример
выхода 1 |
3 DDD DDC DDC |
222 212 211 |
|
|
Пример
входа 2 |
Пример
выхода 2 |
5 DDDDD CDCDC DCCDC DDDDD DDDDD |
11111 12221 12221 11111 |
логика
Вычислим количество городов cnt на игровом поле. Первые cnt / 2 городов относим к первому
государству, остальные – ко второму. Пока все cnt / 2 городов не будут отнесены к первому государству, пустые
клетки будем также относить к первому государству. При таком разделении обе
области государств будут связными.
Пример
Входное игровое поле читаем в массив s. Результирующее поле
строим в массиве res.
#define MAX 55
char s[MAX][MAX], res[MAX][MAX];
Читаем входные данные.
scanf("%d\n",&n);
for(i = 0; i < n; i++)
gets(s[i]);
В переменной cnt подсчитаем количество городов.
cnt = 0;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if (s[i][j]
== 'C') cnt++;
Двигаемся по полю сверху вниз и слева
направо. Первые cnt / 2 городов
относим к первому государству, остальные – ко второму. Пока все cnt / 2 городов не будут отнесены к первому
государству, пустые клетки будем также относить к первому государству.
cnt /= 2;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
if (cnt >
0) res[i][j] = '1'; else
res[i][j] = '2';
if (s[i][j]
== 'C') cnt--;
}
Выводим разделенное игровое поле между двумя государствами.
for(i = 0; i < n; i++)
puts(res[i]);