Используя рекурсию, определить, можно ли по дорогам попасть из 1-го пункта в N-ый - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Имеется 10 населенных пунктов. Дана последовательность пар чисел пар чисел I и J (I<J), указывающих, что I –ый J-ый пункты соединены дорогой. Признак конца этой последовательности - пара нулей. Используя рекурсию, определить, можно ли по этим дорогам попасть из 1-го пункта в N-ый. Помогите, пожалуйста.

Решение задачи: «Используя рекурсию, определить, можно ли по дорогам попасть из 1-го пункта в N-ый»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. #define MAXVERTICES 100
  4. #define MAXEDGES    100
  5. enum { NO, YES };
  6.  
  7. int n;
  8. int found = NO;
  9. int used[MAXVERTICES + 1] = { NO };
  10. int edges[MAXEDGES + 1][2];
  11.  
  12. void walk(int vtx);    
  13.  
  14. int main()
  15. {
  16.         int i, j, cnt;
  17.  
  18.         printf("enter n:\n");
  19.         scanf("%d", &n);
  20.         if (n <= 0 || n > MAXVERTICES)
  21.                 return 1;
  22.         printf("enter edges:\n");
  23.         cnt = 0;
  24.         while (cnt < MAXEDGES
  25.                 && scanf("%d %d", &i, &j) == 2 && i && j) {
  26.                 edges[cnt][0] = i;
  27.                 edges[cnt][1] = j;
  28.                 cnt++;
  29.         }
  30.         edges[cnt][0] = edges[cnt][1] = 0;
  31.         walk(1);
  32.         printf("one can%s\n", found ? "" : "not");
  33.         return 0;
  34. }
  35.  
  36. #define isnotused(vtx) (used[(vtx)] == NO)
  37.  
  38. void walk(int vtx)
  39. {
  40.         int i;
  41.  
  42.         used[vtx] = YES;
  43.         if (vtx == n || found == YES) {
  44.                 found = YES;
  45.                 return;
  46.         }
  47.         for (i = 0; edges[i][0] != 0; i++)
  48.                 if (edges[i][0] == vtx && isnotused(edges[i][1]))
  49.                         walk(edges[i][1]);
  50.                 else if (edges[i][1] == vtx && isnotused(edges[i][0]))
  51.                         walk(edges[i][0]);
  52. }

Объяснение кода листинга программы

В этом коде реализована функция, которая с помощью рекурсии проверяет, можно ли по дорогам попасть из 1-го пункта в N-ый. Для этого в коде представлены следующие элементы:

  1. Объявлены следующие переменные: n - количество вершин в графе, которое вводится пользователем. found - флаг, который указывает, можно ли добраться до последней вершины. used - массив, который отслеживает, была ли уже посещена та или иная вершина. edges - массив, который содержит информацию о ребрах графа.
  2. С помощью функции walk(int vtx) происходит обход графа.
  3. В функции main() пользователю предлагается ввести количество вершин и информацию о ребрах графа.
  4. После сбора данных происходит вызов функции walk(1), которая начинает обход графа с первой вершины.
  5. Результатом работы программы будет сообщение о том, можно ли добраться до последней вершины или нет.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы