Матч
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;
}
};