Матч 33, Охранники замка (CastleGuards)

 

Имеется прямоугольный замок, первый этаж которого охраняется стажей. Элемент castle[i][j] содержит ‘.’, если поле (i, j) свободно, и содержит ‘X’, если в позиции (i, j) находится охранник. В каждой строке и каждом столбце массива castle, описывающего замок, должно находиться хотя бы по одному охраннику. Необходимо добавить наименьшее количество охранников, чтобы выполнялось приведенное выше условие.

 

Класс: CastleGuards

Метод: int missing(vector<string> castle)

Ограничения: castle содержит от 1 до 50 строк, каждая из которых содержит от 1 до 50 символов ‘.’ и ‘X’.

 

Вход. Массив строк castle, описывающий состояние замка.

 

Выход. Наименьшее количество охранников, которое нужно добавить чтобы в каждой строке и каждом столбце массива castle находился хотя бы один охранник.

 

Пример входа

castle

{"....",

"....",

"....",

"...."}

{"....XXXX",

"........",

"XX.X.XX.",

"........",

"........"}

{"XX...",

".XX..",

"...XX"}

 

Пример выхода

4

3

0

 

 

РЕШЕНИЕ

обработка строк

 

Находим количество строк c1 и количество столбцов c2, в которых нет ни одного охранника. Искомое количество охранников, которое нужно добавить, равно max(c1, c2).

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

#include <numeric>

using namespace std;

 

int f(int a, char b)

{

  return a + (b == 'X');

}

 

class CastleGuards

{

public:

  int missing(vector<string> castle)

  {

    int i, j, flag, c1, c2;

    for(c1 = i = 0; i < castle.size(); i++)

      c1 += !accumulate(castle[i].begin(),castle[i].end(),0,f);

    for(c2 = i = 0; i < castle[0].size(); i++)

    {

      flag = 1;

      for(j = 0; j < castle.size(); j++)

        if (castle[j][i] == 'X') flag = 0;

      c2 += flag;

    }

    return (c1 > c2) ? c1 : c2;

  }

};