Разбор задачи F с 1/8 ACM ICPC по украинскому региону 25 марта 2017.
Задача
Степан приобрел душевую кабину, которую решил установить в дачном домике. Дачный домик представляет собой прямоугольник [latex]N \times M[/latex], разбитый на одинарные квадратики. Степан знает, что душевая кабина занимает ровно две клетки с общей стороной. Также Степану известно, что некоторые клетки дома заняты разными вещами. Помогите Степану узнать сколькими способами он может разместить душевую кабину в дачном домике.
Ввод
В первом ряду входных данных находятся два целых числа [latex] N,M(1<=N,M<=1000)[/latex] — размеры дачного домика Степана. Каждый из следующих [latex] N[/latex] рядов содержит по [latex] M[/latex] символов — описание дачного домика Степана. Символ «#» означает, что соответствующая клетка уже чем-то занята, а символ «.» — что она свободна и может стать одной из двух, занятых душевой кабиной.
Вывод
Одно число — количество способов расположить душевую кабину в дачном домике.
Тесты
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <iostream> using namespace std; int main() { int n,m; long s=0; cin>>n>>m; char x[n*m]; for(int i=0;i<n*m;i++) { cin>>x[i]; } for(int i=0;i<n*m;i++) { if(x[i]=='.') { if(x[i]==x[i+1]) { if((i+1)%m!=0) { s++; } } if(x[i]==x[i+m]) { s++; } } } cout<<s; return 0; } |
Решение
Считываем символы в массив . Размер такого массива всегда будет [latex]n \times m[/latex]. Зная это, заводим цикл, в котором проверяем наличие точки(‘.’). Затем проверяем первое условие: если следующий символ тоже точка и если мы не перешли на новую строку, увеличиваем счетчик. Зная количество символов в каждой строке, проверяем символ «под» точкой и если они совпадают опять же увеличиваем счетчик.