Матч 46, Пешки (Pawns)

 

Имеется шахматная доска 8*8, колонки которой пронумерованы буквами от ‘a’ до ‘h’, а строки цифрами от 1 до 8. Одной из шахматных фигур является пешка. Пешка бьет по диагонали. Например, находясь на с3, она угрожает полям b4 и d4. Массив pawns описывает положение пешек на доске, pawns[i] является строкой в формате “<буква><цифра>” и задает положение i-ой пешки на доске. Необходимо найти количество пустых клеток шахматной доски, которым угрожают заданные в массиве pawns пешки.

 

Класс: Pawns

Метод: int pawnsAttack(vector<string> pawns)

Ограничения: pawns содержит от 1 до 20 строк, каждая из которых содержит 2 символа в формате <буква><цифра>, ‘a’ £ <буква> £ ‘h’, 1 £ <цифра> £ 8.

 

Вход. Массив строк pawns, описывающий положение пешек на доске.

 

Выход. Количество пустых клеток шахматной доски, которым угрожают заданные в условии задачи пешки.

 

Пример входа

pawns

{"a1","a8","h8"}

{"a1","b2","c3","d4","e5","f6","g7","h8"}

{"g7","h8","h6"}

 

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

1

6

1

 

 

РЕШЕНИЕ

обработка массива

 

Заведем массив b[10][10], в котором b[i][j] = 1, если клетка шахматной доски (i, j) находится под угрозой хотя бы одной пешки. Сначала отмечаем в массиве b все клетки, находящиеся под ударом. Потом устанавливаем в положение “не атакуемые” все клетки, на которых стоят пешки. В переменной c подсчитываем количество атакуемых полей среди b[i][j], где 1 £ i £ 8, 1 £ j £ 8.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

using namespace std;

 

int b[10][10];

 

class Pawns

{

public:

  int pawnsAttack(vector<string> pawns)

  {

    int i,j,c,r;

    memset(b,0,sizeof(b));

    for(i=0;i<pawns.size();i++)

    {

      r = pawns[i][0]-'a'+1; c = pawns[i][1]-'1'+1;

      b[r-1][c+1] = b[r+1][c+1] = 1;

    }

    for(i=0;i<pawns.size();i++)

    {

      r = pawns[i][0]-'a'+1; c = pawns[i][1]-'1'+1;

      b[r][c] = 0;

    }

    c = 0;

    for(i=1;i<=8;i++)

      for(j=1;j<=8;j++)

        if (b[i][j]) c++;

    return c;

  }

};