Цитата:
Если не заморачиваясь
Тогда и не работает как надо. Если будет несколько вариантов куда можно двигаться, то проверит только 1 вариант.
Цитата:
lab[1][3]="Ж"; lab[2][3]="З"; lab[3][3]="Ж";
С точки lab[2][3] двигаться можно влево и вправо...
Цитата:
начало может быть в рандомном месте сверху. Конец в рандомном месте снизу.
Вход надо тоже определить
Длл распаковать и закинуть в папку с кибор. Проверял только на win10.
https://drive.google.com/file/d/...view?usp=sharing
Функция возвращает количество ходов, строку с направлением движения и координатами, такого вида:
Цитата:
Start 0, 0
Down 1, 0
Right 1, 1
Right 1, 2
и т. д.
Right 1, 2 означает: Right - двигаемся вправо, 1 - номер строки, 2 - номер столбца.
Регуляркой можно получить необходимые данные.
CODE:external(INT, "FindPath", "FindPath", "FindPath.dll");
char result[999];
int lab[7][4]; // 7 строк, 4 столбца
// 0 - Жёлтый, 1 - Красный, 2 - Зелёный.
lab[0][0] = 0; lab[0][1] = 2; lab[0][2] = 0; lab[0][3] = 2;
lab[1][0] = 1; lab[1][1] = 2; lab[1][2] = 0; lab[1][3] = 0;
lab[2][0] = 0; lab[2][1] = 1; lab[2][2] = 1; lab[2][3] = 1;
lab[3][0] = 1; lab[3][1] = 0; lab[3][2] = 2; lab[3][3] = 0;
lab[4][0] = 2; lab[4][1] = 2; lab[4][2] = 1; lab[4][3] = 2;
lab[5][0] = 0; lab[5][1] = 2; lab[5][2] = 0; lab[5][3] = 2;
lab[6][0] = 1; lab[6][1] = 0; lab[6][2] = 1; lab[6][3] = 0;
int CountHod = FindPath(address(#lab[0][0]), address(#result[0]));
if(CountHod>0)
{
messagebox("Всего ходов: "+format(CountHod));
messagebox(format(#result[0]));
}
else messagebox("Путь не найден");
Код длл (Отобразить)CODE:#include "pch.h"
#include <format>
#include <regex>
using namespace std;
const int X = 7;
const int Y = 4;
const int N_MAX = 50;
auto lab = new int[X][Y];
string result[N_MAX];
int CountHod;
bool exit_found;
void CopyArray(int lab[X][Y], int lab2[X][Y])
{
for (int i = 0; i < X; i++)
for (int j = 0; j < Y; j++) lab2[i][j] = lab[i][j];
}
void FindPathFunc(int N, int x, int y, int lab[X][Y])
{
if (N + 1 >= N_MAX) return;
auto labCopy = new int[X][Y];
CopyArray(lab, labCopy);
labCopy[x][y] = 3;
int CurrentKey = (N + 1) % 3;
if (x + 1 == X) // дошли до нижней границы
{
exit_found = true;
CountHod = N;
return;
}
if (!exit_found && x > 0 && labCopy[x - 1][y] == CurrentKey) // вверх
{
result[++N] = std::format("Up {}, {}", --x, y);
FindPathFunc(N--, x++, y, labCopy);
}
if (!exit_found && x + 1 < X && labCopy[x + 1][y] == CurrentKey) // вниз
{
result[++N] = std::format("Down {}, {}", ++x, y);
FindPathFunc(N--, x--, y, labCopy);
}
if (!exit_found && y > 0 && labCopy[x][y - 1] == CurrentKey) // влево
{
result[++N] = std::format("Left {}, {}", x, --y);
FindPathFunc(N--, x, y++, labCopy);
}
if (!exit_found && y + 1 < Y && labCopy[x][y + 1] == CurrentKey) // вправо
{
result[++N] = std::format("Right {}, {}", x, ++y);
FindPathFunc(N--, x, y--, labCopy);
}
delete[] labCopy;
return;
}
extern "C" __declspec(dllexport)int FindPath(int* arr, char* result_str)
{
string EndX = "", EndY = "";
const regex r("(\\d+).+?(\\d+)");
smatch m;
for (int i = 0; i < X; i++)
for (int j = 0; j < Y; j++)
lab[i][j] = arr[j + i * Y];
CountHod = 0;
exit_found = false;
for (int i = 0; i < 4; i++)
{
if (exit_found) break;
if (lab[0][i] != 0) continue;
result[0] = std::format("Start 0, {}", i);
FindPathFunc(0, 0, i, lab);
}
if (!exit_found) return 0;
if (regex_search(result[CountHod++], m, r))
{
EndX = m[1].str();
EndY = m[2].str();
}
result[CountHod] = std::format("Down {}, {}", EndX, EndY);
string resultS = "";
for (int i = 0; i < CountHod; i++) resultS += result[i] + "\r\n";
strcpy(result_str, resultS.c_str());
return CountHod;
}