Условие этой задачи очень простое: вам всего лишь надо определить, сколько клеток находится под боем шахматного коня, одиноко стоящего на шахматной доске. На всякий случай напомним, что конь ходит буквой «Г» — на две клетки по горизонтали или вертикали в любом направлении, и потом на одну клетку в направлении, перпендикулярном первоначальному.
Исходные данные. В первой строке находится число N (1 ≤ N ≤ 100) количество тестов в файле. В каждой из последующих N строк содержится очередной тест: два символа (маленькая латинская буква от 'a' до 'h' и цифра от 1 до 8) — стандартное шахматное обозначение клетки, на которой стоит конь.
Результат. Выходной файл должен состоять из N строк, в каждой из них должно находиться единственное число - количество клеток шахматной доски, находящихся под боем коня.
Пример.
| Исходные данные
| Результат
|
|
a1
d4
g6
|
|
Ниже приведено оригинальное решение Павла Семушина (Самарский лицей информационных технологий).
В программе используется стандартная функция ord, возвращающая код символа. Оператор x:=1+ord(c)-ord('a') дает положение коня по горизонтали (например, если с='a', то x=1), а оператор y:=1+ord(c)-ord('1') по вертикали. В массивах dx и dy закодированы все восемь ходов коня из некоторой точки. Например, dx[1]=1 dy[1]=2 это ход на одну клетку вправо и на две вверх, а dx[4]=1 dy[4]=-2 ход на одну вправо и на две вниз. Те ходы, которые дают координаты от 1 до 8 (битая клетка находится внутри доски), дают нам битые поля.
Const
dx: array[1..8] of integer=(1, 2, 2, 1,-1,-2,-2,-1);
dy: array[1..8] of integer=(2, 1,-1,-2,-2,-1, 1, 2);
Var
i, j, x, y, n, s: integer;
c: char;
Begin
Readln (n);
For i:=1 to n do Begin
Read (c);
x:=1+ord(c)-ord('a');
Readln (c);
y:=1+ord(c)-ord('1');
s:=0;
For j:=1 to 8 do
If ((x+dx[j]) in [1..8]) and ((y+dy[j]) in [1..8])
Then s:=s+1;
Writeln (s);
End;
End.