Главная » Статьи » Разработки уроков |
На полі бою, знаходяться тролі. Їх атакує дракон. Дракон дме вогнем на поле бою. Якщо він попадає в троля, тоді вогонь перекидається на сусідніх по діагоналям з ним тролей. Треба підрахувати, скільки тролей може поразити дракон за один раз, якщо відомо де стоять тролі і куди попадає вогнем дракон. Вхідний файл містить два числа в першому рядку розмір матриці, два числа в другому рядку – місце, куди дихнув дракон, перше число в третьому рядку – кількість тролів, далі пари чисел – їх координати. Максимальний розмір поля 1000 х 1000. Потрібно у вихідний файл вивести кількість вбитих тролів. Наприклад: Dragon.in 6 6 4 3 10 1 3 1 4 1 6 2 5 3 2 3 4 4 3 5 2 5 5 5 6 Dragon.out 7 Задача зводиться к підрахуванню вбитих тролів. Отже, якщо в полі, куди дихнув дракон є троль, тоді треба перевірити суміжні з ним по діагоналі. Якщо в них теж буде стояти троль, треба знову перевіряти суміжні поля, і так далі, доки ланцюжок не закінчиться. Найпростішим рішенням цієї задачі – є створення рекурсії. Постійно повторюється одна дія – це перевірка суміжних полів. Цю дію і треба зробити рекурсивною функцією. //с++ int cnt; //кількість вбитих тролів int a[1000][1000]; //масив для розташування тролів, //1 – є троль, 0 - немає int x,y; //координати дихання дракона
int Chang (int x, int y) { cnt++; //рахуємо вбитих тролів a[x][y] = 0; if (a[x+1][y+1] == 1) Chang (x+1, y+1); if (a[x+1][y-1] == 1) Chang (x+1, y-1); if (a[x-1][y+1] == 1) Chang (x-1, y+1); if (a[x-1][y-1] == 1) Chang (x-1, y-1); return 0; }
int main () { // читання вхідних даних
if (a[x][y] == 1) Chang(x,y);
// друк рузультатів return 0 }
/*tp*/ Program Dragon; Var cnt: integer; a: array 1..1000,1..1000 of integer; x,y: integer;
procedure Chang (x: integer, y: integer) Begin cnt := cnt+1; a[x][y] := 0; if (a[x+1][y+1] = 1) then Chang (x+1, y+1); if (a[x+1][y-1] = 1) then Chang (x+1, y-1); if (a[x-1][y+1] = 1) then Chang (x-1, y+1); if (a[x-1][y-1] = 1) then Chang (x-1, y-1); End;
BEGIN /* читання вхідних даних */
if (a[x][y] = 1) Chang(x,y);
/* друк рузультатів */ END. | |
| |
Просмотров: 458 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |