Для хранения графа в виде 2D массивов и списков смежности требуется определить структуру данных, которая будет отражать узлы (вершины) и их связи (рёбра).
### Структуры данных
Пусть `Node` — это структура, которая представляет узел (вершину) на карте (например, в 2D пространстве).
```c
typedef struct {
int x; // Координата x узла
int y; // Координата y узла
// другие данные...
} Node;
```
Теперь определим узлы, используя 2D массив:
```c
Node nodes[M][N]; // 2D массив узлов
```
Где `M` и `N` — размеры графа по горизонтали и вертикали соответственно.
Далее, создадим структуру для представления списка смежности:
```c
typedef struct AdjListNode {
Node* node; // Указатель на узел
struct AdjListNode* next; // Указатель на следующий элемент списка
} AdjListNode;
typedef struct {
AdjListNode* head; // Указатель на голову списка смежности для узла
} AdjList;
```
И массив списков смежности:
```c
AdjList adjLists[M * N]; // Массив списков смежности для каждого узла в графе
```
### Создание графа
Чтобы нарисовать или создать граф со списком смежности, необходимо инициализировать все узлы и списки смежности. Для каждого узла в массиве узлов вы должны добавить соответствующие связи в его список смежности, что отражает суседство узлов в графе.
### Поиск по кругу на N радиусе
Поиск по кругу на N радиусе от ячейки 2D массива можно выполнить с помощью алгоритмов обхода графа, таких как поиск в глубину (DFS) или поиск в ширину (BFS).
```c
void breadthFirstSearch(Node startNode, int radius) {
// Здесь, вам нужно реализовать BFS, который ищет узлы не дальше определённого радиуса
}
```
Используя BFS с ограничением по глубине равным `radius`, можно изучить граф топологически слой за слоем.
### Момент перехода от начальной ноды к её подключенным соседям
Для того чтобы отследить момент перехода от начальной ноды к её соседям, следите за уровнем или глубиной при выполнении BFS. Каждый раз, когда вы заходите глубже, вы переходите от одного уровня узлов к следующему.
Добавьте структуру, отслеживающую уровень обхода:
```c
typedef struct {
Node* node;
int level; // Уровень данного узла в отношении начального узла
} QueueItem;
```
Используйте эту структуру в вашей очереди при BFS, чтобы узнать, когда вы переходите на следующий уровень.
Обратите внимание, что приведенная информация является общим наброском реализации графа и алгоритмов поиска в нем. На практике вам потребуется реализовать функции добавления рёбер в список смежностей, обработки