findpath(#labirint[0][0], #pyt[0][0], sizeX, sizeY)
Первый параметр указатель на двухмерный массив int в котором записан лабиринт в виде:
0 - свободный проход
1 - стена
2 - старт
3 - финиш
Второй параметр указатель на двухмерный массив int в который запишется кратчайший путь в виде нумерации от 0 (старт), до финишной позиции включительно:
0 1 2 3 4 5 и тд.
-1 - все остальное поле лабиринта
Третий - размер лабиринта по X
Четвертый - размер лабиринта по Y
Выделяемая память под первый и второй параметр может быть больше размера лабиринта.
Возвращает функция количество шагов.
-1 если размер лабиринта более чем выделено памяти в массивах.
0 - если пути нет.
========================
Массивы лабиринта и результата заполняются в соответствие:
Первый индекс X
Второй Y.
Нулевой индекс находится в левом верхнем углу лабиринта
Нажмите для увеличения
Пример:
Есть данный лабиринта. Они у нас записаны в фал в таком виде:
Цитата:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 0 0 0 0 0 1 1 1 0 0 3 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1
1 1 2 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 0
1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 0 0 0 0 0 1 1 1 0 0 3 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 0 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1
1 1 2 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 0
1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 1 1 1 1 0 1 1 1 1 1
1 1 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1
1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Код читающий файл лабиринта и находящий кратчайший путь:
CODE:
int labirint[330][11];
int pyt[330][11];
int sizeX=33;
int sizeY=11;
if (fopen ("D:\map.txt", "r")!=0)//открываем файл для чтения "r"
{//если открылся
for (int y=0; y<sizeY; y++)
{
for (int x=0; x<sizeX; x++)
{
fread(labirint[x][y]);
}
}
fclose();//закрываем файл
}
int k=findpath(#labirint[0][0], #pyt[0][0], sizeX, sizeY);
messagebox(k);
int xx=200, yy=200;
int n=0;
if (k>0)
{
for (y=0; y<sizeY; y++)
{
xx=200;
for (x=0; x<sizeX; x++)
{
textout(n, xx, yy, format(pyt[x][y]), 0);
n++;
xx=xx+25;
}
yy=yy+25;
}
loop()sleep(10);
}
int pyt[330][11];
int sizeX=33;
int sizeY=11;
if (fopen ("D:\map.txt", "r")!=0)//открываем файл для чтения "r"
{//если открылся
for (int y=0; y<sizeY; y++)
{
for (int x=0; x<sizeX; x++)
{
fread(labirint[x][y]);
}
}
fclose();//закрываем файл
}
int k=findpath(#labirint[0][0], #pyt[0][0], sizeX, sizeY);
messagebox(k);
int xx=200, yy=200;
int n=0;
if (k>0)
{
for (y=0; y<sizeY; y++)
{
xx=200;
for (x=0; x<sizeX; x++)
{
textout(n, xx, yy, format(pyt[x][y]), 0);
n++;
xx=xx+25;
}
yy=yy+25;
}
loop()sleep(10);
}
=====================================================
Видео демострирующее анализ лабиринта по картинке, поск и прорисовку в паинте на нем кратчайшего пути.
Нажмите для увеличения
Скрипт:
CODE:
int labirint[180][180];
int pyt[180][180];
int sizeX, sizeY;
int kx[180][180];
int ky[180][180];
int sX=8;
int sY=145;
int fX=539;
int fY=675;
int image_start[1][1];
int image_finish[1][1];
int image_proxod[3][3];
int erskr[570][570];
int x, y, xxx, yyy, tx, ty;
image_start[0][0]=65280;
image_finish[0][0]=255;
for (x=0; x<3; x++)
{
for (y=0; y<3; y++)image_proxod[x][y]=16777215;
}
pause(1000);
screen (#erskr[0][0], sX, sY, fX, fY, -1);
x=0; y=0;
for (yyy=0; yyy<525; yyy=yyy+4)
{
x=0;
for (xxx=0; xxx<525; xxx=xxx+4)
{
labirint[x][y]=1;
if (findimage(1, #image_proxod[0][0], -1, #tx, #ty, xxx, yyy, xxx+4, yyy+4, #erskr[0][0])==1)labirint[x][y]=0;
if (findimage(1, #image_start[0][0], -1, #tx, #ty, xxx, yyy, xxx+4, yyy+4, #erskr[0][0])==1)labirint[x][y]=2;
if (findimage(1, #image_finish[0][0], -1, #tx, #ty, xxx, yyy, xxx+4, yyy+4, #erskr[0][0])==1)labirint[x][y]=3;
kx[x][y]=xxx+sX;
ky[x][y]=yyy+sY;
x++;
}
y++;
}
sizeX=x;
sizeY=y;
int k=findpath(#labirint[0][0], #pyt[0][0], sizeX, sizeY);
if (k>0)
{
for (y=0; y<sizeY; y++)
{
for (x=0; x<sizeX; x++)
{
if (pyt[x][y]>-1)mouse(LEFT, kx[x][y]+2, ky[x][y]+2);
}
}
if (fopen ("c:\ЛАБИРИНТ.txt", "w")!=0)
{
for (y=0; y<sizeY; y++)
{
for (x=0; x<sizeX; x++)
{
fwrite(labirint[x][y]);
fwrite(" ");
}
fwrite(ENDL);
}
fclose();
}
}
messagebox(k);
int pyt[180][180];
int sizeX, sizeY;
int kx[180][180];
int ky[180][180];
int sX=8;
int sY=145;
int fX=539;
int fY=675;
int image_start[1][1];
int image_finish[1][1];
int image_proxod[3][3];
int erskr[570][570];
int x, y, xxx, yyy, tx, ty;
image_start[0][0]=65280;
image_finish[0][0]=255;
for (x=0; x<3; x++)
{
for (y=0; y<3; y++)image_proxod[x][y]=16777215;
}
pause(1000);
screen (#erskr[0][0], sX, sY, fX, fY, -1);
x=0; y=0;
for (yyy=0; yyy<525; yyy=yyy+4)
{
x=0;
for (xxx=0; xxx<525; xxx=xxx+4)
{
labirint[x][y]=1;
if (findimage(1, #image_proxod[0][0], -1, #tx, #ty, xxx, yyy, xxx+4, yyy+4, #erskr[0][0])==1)labirint[x][y]=0;
if (findimage(1, #image_start[0][0], -1, #tx, #ty, xxx, yyy, xxx+4, yyy+4, #erskr[0][0])==1)labirint[x][y]=2;
if (findimage(1, #image_finish[0][0], -1, #tx, #ty, xxx, yyy, xxx+4, yyy+4, #erskr[0][0])==1)labirint[x][y]=3;
kx[x][y]=xxx+sX;
ky[x][y]=yyy+sY;
x++;
}
y++;
}
sizeX=x;
sizeY=y;
int k=findpath(#labirint[0][0], #pyt[0][0], sizeX, sizeY);
if (k>0)
{
for (y=0; y<sizeY; y++)
{
for (x=0; x<sizeX; x++)
{
if (pyt[x][y]>-1)mouse(LEFT, kx[x][y]+2, ky[x][y]+2);
}
}
if (fopen ("c:\ЛАБИРИНТ.txt", "w")!=0)
{
for (y=0; y<sizeY; y++)
{
for (x=0; x<sizeX; x++)
{
fwrite(labirint[x][y]);
fwrite(" ");
}
fwrite(ENDL);
}
fclose();
}
}
messagebox(k);