Другие языки программирования и технологии

Программа на Си (не С++), Поля, Для экспертов.

Вводим размеры поля
Например:
4 4
Потом заполняем его с клавиатуры ([o] - здоровые клетки, [.] - пустота, [!] - больная клетка):
Например:
o.oo
o.oo
o..o
!o.o
И тут самое интересное, программа должна рассчитать сколько здоровых клеток заразит больная клетка, и сколько затрачено дней.
За один день заражаются клетки около восклицательного знака (сверху и снизу, слева и справа):
то есть:
Было:
o.oo
o.oo
o..o
!o.o
Первый день (не выводится):
o.oo
o.oo
!..o
!!.o
Второй день (не выводится):
o.oo
!.oo
!..o
!!.o
Третий день (не выводится):
!.oo
!.oo
!..o
!!.o
В итоге программа выведет:
Зараженных 5, количеств дней 3.

Еще пример работы программы:

Размеры поля:
4 4
oooo
o.oo
o..o
!o.o
Зараженных: 12, количество дней: 9

Размеры поля:
2 2
.o
o.
Никто не заражен.

Размеры поля:
4 4
oooo
oooo
oooo
Xooo
Неверный ввод.

Размеры поля:
4 4
oooo
ooooo
oooo
!ooo
Неверный ввод.

Размеры поля:
5 4
oooo
oooo
oooo
!ooo
Неверный ввод.

Размеры поля:
7 8
!ooooooo
....o
oooooooo
o....
oooooooo
....o
oooooooo
Зараженных: 35, Количество дней: 34

Размеры поля:
4 4
oooo
oooo
oooo
!ooo
Зараженных: 16, Количество дней: 6

За неверный ввод воспринимается:
Размеры поля не целое число
При вводе элементов поля не использован отступ (Enter)
Поле не соответствует введенным размерам
Использованы символы кроме ! .o

Необходимы советы начинающему программисту от профессионалов. Спасибо!
вот посмотри моё решение http://pastebin.com/qsaUUqv5
кстати у тебя в задаче ошибка:
- программа должна рассчитать сколько здоровых клеток заразит больная клетка, и сколько затрачено дней.
и твой пример говорит что для
oooo
oooo
oooo
!ooo
Зараженных: 16, Количество дней: 6
но на самом деле выведет 15 - 6, потому что 1 уже была заражена.

пример вывода моей программы лови картинкой.

ещё вот дополнения по моему решению:
1. функция clone_field не понадобилась к сожалению
2. функцию free_field мне было делать настолько лениво, что она закомменчена.
Георгий Жилковский
Георгий Жилковский
2 570
Лучший ответ
Евгений Константинов Спасибо, однако по поводу:
и твой пример говорит что для
oooo
oooo
oooo
!ooo
Зараженных: 16, Количество дней: 6
но на самом деле выведет 15 - 6, потому что 1 уже была заражена
Дан образец, и там надо посчитать сколько больных клеток в общем, считая ту зараженную!
Извиняюсь за не точно предоставленную информацию
Это ж алгоритм открытия пустой области - по примеру игры "Сапер". Сам лично не видел его - но попробую логически сформулировать. Нам нужно два стека - которые мы будем постоянно swap-ать, удобно сделать массив из двух стеков. В первый мы будем ложить уже зараженные клетки, во второй клетки которые будут заражены на следующий день. Допустим отталкиваясь от вашего примера - уже имеем одну зараженную клетку. Число возможных зараженных клеток за один день = 4.Проверка по алгоритму.
1.Если верхняя/нижняя/левая/правая клетка относительно зараженной лежит в области границ массива и это здоровая клетка заталкиваем его в стек заражения след. днем. Иначе не заталкиваем. Нашу зараженную клетку относительно который мы проверяли выталкиваем из стека.
2.Повторяем эту проверку до тех пор пока не вытолкнем все зараженные клетки. Таким образом мы заполним второй стек, и поменяем местами стеки в след итерации цикла, чтобы заполнять по алгоритму уже пустой стек, а этот наоборот станет зараженным. Все это повторяем пока оба стека не окажутся пустыми.
Форматирование ячеек думаю сами сделаете...