Сайт учителя информатики и технологии Близниченко А.В. Суббота, 18.05.2024, 08:58
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Каталог статей | Мой профиль | Регистрация | Выход | Вход
Главная » Статьи » Разработки уроков

Рекурсія.

На полі бою, знаходяться тролі. Їх атакує дракон. Дракон дме вогнем на поле бою. Якщо він попадає в троля, тоді вогонь перекидається на сусідніх по діагоналям з ним тролей. Треба підрахувати, скільки тролей може поразити дракон за один раз, якщо відомо де стоять тролі і куди попадає вогнем дракон.

Вхідний файл містить два числа в першому рядку розмір матриці, два числа в другому рядку – місце, куди дихнув дракон, перше число в третьому рядку – кількість тролів, далі пари чисел – їх координати. Максимальний розмір поля 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.

Категория: Разработки уроков | Добавил: asya (22.05.2014)
Просмотров: 458 | Рейтинг: 0.0/0
Всего комментариев: 0

Copyright MyCorp © 2024