ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Поиск Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° НахоТдСниС доступных (смСТных) ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅ (Ρ‚Π΅Ρ… мСст, ΠΊΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ) для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ поиска. Если позиция Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅ Π±Π΅Π»ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°, Ρ‚. Π΅. Π΅Ρ‰Ρ‘ Π½ΠΈ Ρ€Π°Π·Ρƒ Π½Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Π»Π°ΡΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ Π΅ΡΠ»ΠΈ Π½Π΅ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚Π° Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ позиция. Поиск Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ поиском Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ (рСкурсивно) Данная рСализация прСдставлСна Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ классом… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Поиск Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

ΠšΡƒΡ€ΡΠΎΠ²Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ

" Поиск Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅"

Поиск Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ:

Алгоритм

РСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° поиска:

Поиск Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ поиском Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ (рСкурсивно) Данная рСализация прСдставлСна Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ классом tLabirint.

Условно Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ…:

Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° НахоТдСниС доступных (смСТных) ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅ (Ρ‚Π΅Ρ… мСст, ΠΊΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ) для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ поиска.

Поиск с ΠΏΠΎΡˆΠ°Π³ΠΎΠ²Ρ‹ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ².

Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π°.

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π° хранится Π² Π²ΠΈΠ΄Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒΡŽ 51Π₯51. 51Π₯51 Π½Π° ΠΌΠΎΠΉ взгляд достаточно.

Π€ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°:

1 стока: Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°

2 строка: ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π₯ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ (стартовой) ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ

3 строка: ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Y Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ (стартовой) ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ

4 строка: ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Π₯ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ (Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ) ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ

5 строка: ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π° Y ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ (Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ) ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ΄Π΅Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ n ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½Π° n ΡΡ‚Ρ€ΠΎΠΊ, Π³Π΄Π΅ n — число ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки Ρ„Π°ΠΉΠ»Π°, Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠŸΡ€ΠΈΡ‡Π΅ΠΌ символ «1» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ символ «0» ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ прСпятствиС ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°:

void tLabirint: ReadMatrix ()

{

FILE *f;

char ch;

int i, j, n;

//ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ»

f = fopen («input.txt», «rt»);

// Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ

fread (&ch, sizeof (ch), 1, f);

// ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΠΌ Π² Ρ‡ΠΈΡΠ»ΠΎ

n = atoi (&ch);

// Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки

fread (&ch, sizeof (ch), 1, f);

// Π§ΠΈΡ‚Π°Π΅ΠΌ ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π₯

fread (&ch, sizeof (ch), 1, f);

start.x = atoi (&ch);

// Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки

fread (&ch, sizeof (ch), 1, f);

//Π§ΠΈΡ‚Π°Π΅ΠΌ ΡΡ‚Π°Ρ€Ρ‚ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π£

fread (&ch, sizeof (ch), 1, f);

start.y = atoi (&ch);

// Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки

fread (&ch, sizeof (ch), 1, f);

//Π§ΠΈΡ‚Π°Π΅ΠΌ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π₯

fread (&ch, sizeof (ch), 1, f);

finish.x = atoi (&ch);

// Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки

fread (&ch, sizeof (ch), 1, f);

// Π§ΠΈΡ‚Π°Π΅ΠΌ Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π£

fread (&ch, sizeof (ch), 1, f);

finish.y = atoi (&ch);

// Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки

fread (&ch, sizeof (ch), 1, f);

count_a=n;

memset (a, 0, sizeof (a));

// Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°

for (i=1;i<=count_a;i++)

{

for (j=1;j<=count_a;j++)

{

fread (&ch, sizeof (ch), 1, f);

a[i][j]=atoi (&ch);

ch=0;

}

// Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ строки

fread (&ch, sizeof (ch), 1, f);

}

fclose (f);

/*

for (i=1;i<=count_a;i++)

{

for (j=1;j<=count_a;j++)

printf («%d», a[i][j]);

printf («n»);

}

*/

}

НахоТдСниС свободных мСст Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅.

Ѐункция Π±Π΅Ρ€Π΅Ρ‚ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ i, j, соотвСтствСнно X ΠΈ Y. Бсылку Π½Π° ΠΌΠ°ΡΡΠΈΠ² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ s

int tLabirint: GetCommon (int i, int j, smezh &s)

{

tCoords check[5];

int k, count;

count=0;

// Π’Π²Π΅Ρ€Ρ…

check[1]. x=j;

check[1].y=i-1;

// Π’ ΠΏΡ€Π°Π²ΠΎ

check[2]. x=j+1;

check[2].y=i;

// Π’Π½ΠΈΠ·

check[3]. x=j;

check[3].y=i+1;

// Π’Π»Π΅Π²ΠΎ

check[4]. x=j-1;

check[4].y=i;

for (k=1;k<=4;k++)

{

// Если Π½Π΅ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚Ρ‹ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹,

if ((check[k]. x>0) && (check[k]. y>0) && (check[k]. x<=count_a) && (check[k]. y<=count_a))

{

// Π’ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π½Π° Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ

if (a[check[k]. y][check[k].x]==1)

{

// И Π΅ΡΠ»ΠΈ позиция с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ X, Y Π΄ΠΎΡΡ‚ΡƒΠΏΠ½Π°, Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊ ΡΡ‚Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² ΠΌΠ°ΡΡΠΈΠ² s Π΄ΠΎΡΡ‚ΡƒΠΏΠ½Ρ‹Ρ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ

count++; s[count]. x=check[k].x;

s[count].y=check[k].y;

}

}

}

// Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ число доступных ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ.

return count;

}

Поиск Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅.

void tLabirint: Find ()

{

GetCoords (); // ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹

DFS ();//произвСсти поиск

if (flag==0)

outtextxy (20, 440, «No way!»); //Если ΠΏΡƒΡ‚ΡŒ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½

else

outtextxy (20, 440, «Found way!»); //Если Π½Π°ΠΉΠ΄Π΅Π½ ΠΏΡƒΡ‚ΡŒ

}

void tLabirint: DFS ()

{

flag=0; // Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π½Π΅Ρ‚ ΠΏΡƒΡ‚ΠΈ

DFS_Visit (start.y, start. x); // Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ поиск

}

void tLabirint: DFS_Visit (int y, int x)

{

int i;

int cnt;

smezh sm;

// Искомая Π²Π΅Ρ€ΡˆΠΈΠ½Π° достигнута?

if (flag==1)

{

// Если Π΄Π°, Ρ‚ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄

exit;

}

/**/

//ΠšΡ€Π°ΡΠΈΠΌ Π²Π΅ΡˆΠΈΠ½Ρƒ Π² ΡΠ΅Ρ€Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚, Ρ‚. Π΅. Π½Π°Ρ‡Π°Π»ΠΈ Π΅Ρ‘ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ

color[y][x]=1;

delay (500);

count_p++;

path[count_p]. x=x;

path[count_p].y=y;

setcolor (BLUE);

//defaultmouseoff;

gui->Circle (sx+x*edge-edge / 2, sy+y*edge-edge / 2, 3);

//defaultmouseon;

//printf («X-%d;Y-%dn», x, y);

//getchar ();

if ((finish.x==x) && (finish.y==y))

flag=1;

/**/

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°, ΠΊΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ΄Ρ‚ΠΈ

cnt=GetCommon (y, x, sm);

for (i=1;i<=cnt;i++)

{

// Если позиция Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅ Π±Π΅Π»ΠΎΠ³ΠΎ Ρ†Π²Π΅Ρ‚Π°, Ρ‚. Π΅. Π΅Ρ‰Ρ‘ Π½ΠΈ Ρ€Π°Π·Ρƒ Π½Π΅ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Π»Π°ΡΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΈ Π΅ΡΠ»ΠΈ Π½Π΅ Π΄ΠΎΡΡ‚ΠΈΠ³Π½ΡƒΡ‚Π° Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Π°Ρ позиция

if (color[sm[i]. y][sm[i].x]==0 && flag==0)

// ΠŸΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π΅ΠΌ эти ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹

DFS_Visit (sm[i]. y, sm[i]. x);

}

color[y][x]=2; // ΠšΡ€Π°ΡΠΈΠΌ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚, Ρ‚. Π΅. всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρƒ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ рассмотрСны.

}

ГрафичСский Π²Ρ‹Π²ΠΎΠ΄

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° иСрархия классов для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Π³Ρ€Π°Ρ„ичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π½Π° ΡΠΊΡ€Π°Π½.

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ класс.

Π£ Π½Π΅Π³ΠΎ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹.

class tMyObj

{

protected:

int x0, y0;

public:

tMyObj (){};

~tMyObj (){};

tMyObj (int _x, int _y){x0=_x;y0=_y;};

};

Класс линия

Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс, ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π΄Π²Π΅ ΠΏΠ°Ρ€Ρ‹ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ (Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠΈ).

class tMyLine: public tMyObj

{

int x1, y1;

public:

tMyLine (){};

~tMyLine (){};

tMyLine (int _x, int _y, int _x1, int _y1):tMyObj (_x, _y){x1=_x1;y1=_y1;};

void Show (){line (x0, y0, x1, y1);};

void Hide (){int o = getcolor ();int b = getbkcolor ();setcolor (b);Show ();setcolor (o);}

};

Класс ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ.

Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса tMyObj класс. Он ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ радуис.

class tMyCircle: public tMyObj

{

int rad;

public:

tMyCircle (){};

~tMyCircle (){};

tMyCircle (int _x, int _y, int _rad):tMyObj (_x, _y){rad=_rad;};

void Show (){circle (x0, y0, rad);}

};

Класс ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ.

Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса tMyObj класс ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π΅ ΠΏΠ°Ρ€Ρ‹ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ (Π›Π΅Π²ΡƒΡŽ Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ ΠΈ ΠΏΡ€Π°Π²ΡƒΡŽ ниТнюю Ρ‚ΠΎΡ‡ΠΊΠΈ)

class tMyRect: public tMyObj

{

int x1, y1;

public:

tMyRect (){};

~tMyRect (){};

tMyRect (int _x, int _y, int _x1, int _y1):tMyObj (_x, _y){x1=_x1;y1=_y1;};

void Show (){rectangle (x0, y0, x1, y1);};

void Hide (){int o = getcolor ();int b = getbkcolor ();setcolor (b);Show ();setcolor (o);}

};

Класс графичСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ².

Класс графичСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² позволяСт Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ графичСскиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹: линия, ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, Π½Π° ΡΠΊΡ€Π°Π½. Π­Ρ‚ΠΎ достигаСтся созданиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² классов ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ², Ρ‚. Π΅. ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² классов линия, ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ.

class tMyGUI

{

public:

tMyGUI ();

~tMyGUI ();

void Line (int x, int y, int x1, int y1);

void Circle (int x, int y, int rad);

void Rectangle (int x, int y, int x1, int y1);

void Fill (int x, int y, int Color);

};

void tMyGUI: Line (int x, int y, int x1, int y1)

{

tMyLine tl (x, y, x1, y1);

tl.Show ();

}

void tMyGUI: Circle (int x, int y, int rad)

{

tMyCircle tc (x, y, rad);

tc.Show ();

}

void tMyGUI: Rectangle (int x, int y, int x1, int y1)

{

tMyRect tr (x, y, x1, y1);

tr.Show ();

}

void tMyGUI: Fill (int x, int y, int Color)

{

floodfill (x, y, Color);

}

tMyGUI:tMyGUI ()

{

int gdriver = DETECT, gmode, errorcode;

initgraph (&gdriver, &gmode, «»);

errorcode = graphresult ();

if (errorcode ≠ grOk) /* an error occurred */

{

printf («Graphics error: %sn», grapherrormsg (errorcode));

printf («Press any key to halt:»);

getch ();

exit (1);

/* return with error code */

}

}

tMyGUI:~tMyGUI ()

{

closegraph ();

}

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅

Π’ΠΈΠΏ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ собой структуру с Π΄Π²ΡƒΠΌΡ полями x ΠΈ y.

typedef struct _tCoords

{

int x;

int y;

} tCoords;

Π’ΠΈΠΏ Π‘ΠΌΠ΅ΠΆΠ½ΠΎΡΡ‚ΡŒ

ОбъявлСн ΠΊΠ°ΠΊ массив Π½Π° 51 элСмСнт Ρ‚ΠΈΠΏΠ° tCoords

typedef tCoords smezh[51];

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹.

Максимальная Π΄Π»ΠΈΠ½Π° ΠΏΡƒΡ‚ΠΈ.

const MAX_PATH=100;

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

#include

#include

#include

#include

#include

#include

typedef struct _tCoords

{

int x;

int y;

} tCoords;

typedef tCoords smezh[51];

const MAX_PATH=100;

class tMyObj

{

protected:

int x0, y0;

public:

tMyObj (){};

~tMyObj (){};

tMyObj (int _x, int _y){x0=_x;y0=_y;};

};

class tMyLine: public tMyObj

{

int x1, y1;

public:

tMyLine (){};

~tMyLine (){};

tMyLine (int _x, int _y, int _x1, int _y1):tMyObj (_x, _y){x1=_x1;y1=_y1;};

void Show (){line (x0, y0, x1, y1);};

void Hide (){int o = getcolor ();int b = getbkcolor ();setcolor (b);Show ();setcolor (o);}

};

class tMyCircle: public tMyObj

{

int rad;

public:

tMyCircle (){};

~tMyCircle (){};

tMyCircle (int _x, int _y, int _rad):tMyObj (_x, _y){rad=_rad;};

void Show (){circle (x0, y0, rad);}

};

class tMyRect: public tMyObj

{

int x1, y1;

public:

tMyRect (){};

~tMyRect (){};

tMyRect (int _x, int _y, int _x1, int _y1):tMyObj (_x, _y){x1=_x1;y1=_y1;};

void Show (){rectangle (x0, y0, x1, y1);};

void Hide (){int o = getcolor ();int b = getbkcolor ();setcolor (b);Show ();setcolor (o);}

};

class tMyGUI

{

public:

tMyGUI ();

~tMyGUI ();

void Line (int x, int y, int x1, int y1);

void Circle (int x, int y, int rad);

void Rectangle (int x, int y, int x1, int y1);

void Fill (int x, int y, int Color);

};

void tMyGUI: Line (int x, int y, int x1, int y1)

{

tMyLine tl (x, y, x1, y1);

tl.Show ();

}

void tMyGUI: Circle (int x, int y, int rad)

{

tMyCircle tc (x, y, rad);

tc.Show ();

}

void tMyGUI: Rectangle (int x, int y, int x1, int y1)

{

tMyRect tr (x, y, x1, y1);

tr.Show ();

}

void tMyGUI: Fill (int x, int y, int Color)

{

floodfill (x, y, Color);

}

tMyGUI:tMyGUI ()

{

int gdriver = DETECT, gmode, errorcode;

initgraph (&gdriver, &gmode, «»);

errorcode = graphresult ();

if (errorcode ≠ grOk) /* an error occurred */

{

printf («Graphics error: %sn», grapherrormsg (errorcode));

printf («Press any key to halt:»);

getch ();

exit (1);

/* return with error code */

}

}

tMyGUI:~tMyGUI ()

{

closegraph ();

}

class tLabirint

{

int a[51][51];

// ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°

tCoords path[MAX_PATH+1]; // ΠŸΡƒΡ‚ΡŒ

int color[51][51];

// Массив Ρ†Π²Π΅Ρ‚ΠΎΠ². Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΠΎΠΈΡΠΊΠ΅ для помСчивания ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅

int count_a; // Π Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°

int count_p; // Π”Π»ΠΈΠ½Π½Π° ΠΏΡƒΡ‚ΠΈ. Ρ‚. Π΅. ΠΊΠΎΠ»-Π²ΠΎ элСмСнтов Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ path

int flag; // Π­Ρ‚Π° пСрСмСнная ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ достигнута конСчная позиция ΠΈΠ»ΠΈ Π½Π΅Ρ‚

tCoords start, finish; // ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ

int cx, cy; // Π¦Π΅Π½Ρ‚Ρ€ экрана

int edge; // Π Π°Π·ΠΌΠ΅Ρ€ Ρ€Π΅Π±Ρ€Π°

int sx, sy; // ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ для рисования Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°

int fx, fy; // ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ для рисования Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π°

tMyGUI *gui; // ΠžΠ±ΡŠΠ΅ΠΊΡ‚ класса Π²Ρ‹Π²ΠΎΠ΄Π° графичСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ²

public:

tLabirint (); // конструктор

~tLabirint (); // ДСструктор

void ReadMatrix (); // Π‘Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ

int GetCommon (int i, int j, smezh &s); // Найти Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅

void DFS_Visit (int y, int x); // ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π² Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚Π΅

void DFS (); // Поиск Π² Π³Π»ΡƒΠ±ΡŒ

void DrawLabirint (); // ΠΠ°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π»Π°Π±ΠΈΡ€ΠΈΠ½Ρ‚

void GetCoords (); // Π‘Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ

void Find (); // Π˜ΡΠΊΠ°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ

};

tLabirint:tLabirint ()

{

int i, j;

flag=0;

start.x=0;

start.y=0;

finish.x=0;

finish.y=0;

for (i=1;i<=count_a;i++)

for (j=1;j<=count_a;j++)

color[i][j]=0;

for (i=1;i<=MAX_PATH;i++)

{

path[i]. x=0;

path[i].y=0;

}

count_p=0;

gui = new tMyGUI ();

}

tLabirint:~tLabirint ()

{

delete gui;

}

void tLabirint: ReadMatrix ()

{

FILE *f;

char ch;

int i, j, n;

f = fopen («input.txt», «rt»);

fread (&ch, sizeof (ch), 1, f);

n = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

//Chitat' startovuyu pozitciu: X

fread (&ch, sizeof (ch), 1, f);

start.x = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

//Chitat' startovuyu pozitciu: Y

fread (&ch, sizeof (ch), 1, f);

start.y = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

//Chitat' final’nuyu pozitciu: X

fread (&ch, sizeof (ch), 1, f);

finish.x = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

//Chitat' final’nuyu pozitciu: Y

fread (&ch, sizeof (ch), 1, f);

finish.y = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

count_a=n;

memset (a, 0, sizeof (a));

for (i=1;i<=count_a;i++)

{

for (j=1;j<=count_a;j++)

{

fread (&ch, sizeof (ch), 1, f);

a[i][j]=atoi (&ch);

ch=0;

}

fread (&ch, sizeof (ch), 1, f);

}

fclose (f);

/*

for (i=1;i<=count_a;i++)

{

for (j=1;j<=count_a;j++)

printf («%d», a[i][j]);

printf («n»);

}

*/

}

int tLabirint: GetCommon (int i, int j, smezh &s)

{

//struct

tCoords check[5];

int k, count;

count=0;

check[1]. x=j;

check[1].y=i-1;

check[2].x=j+1;

check[2].y=i;

check[3].x=j;

check[3].y=i+1;

check[4].x=j-1;

check[4].y=i;

for (k=1;k<=4;k++)

{

if ((check[k].x>0) && (check[k]. y>0) && (check[k]. x<=count_a) && (check[k]. y<=count_a))

{

if (a[check[k].y][check[k].x]==1)

{

count++;

s[count].x=check[k].x;

s[count].y=check[k].y;

}

}

}

return count;

}

void tLabirint: DFS_Visit (int y, int x)

{

int i;

int cnt;

smezh sm;

if (flag==1)

{

exit;

}

/**/

color[y][x]=1;

delay (500);

count_p++;

path[count_p]. x=x;

path[count_p].y=y;

setcolor (BLUE);

//defaultmouseoff;

gui->Circle (sx+x*edge-edge / 2, sy+y*edge-edge / 2, 3);

//defaultmouseon;

//printf («X-%d;Y-%dn», x, y);

//getchar ();

if ((finish.x==x) && (finish.y==y))

flag=1;

/**/

cnt=GetCommon (y, x, sm);

for (i=1;i<=cnt;i++)

{

if (color[sm[i]. y][sm[i].x]==0 && flag==0)

DFS_Visit (sm[i]. y, sm[i]. x);

}

color[y][x]=2;

}

void tLabirint: DFS ()

{

flag=0;

DFS_Visit (start.y, start. x);

}

void tLabirint: DrawLabirint ()

{

int i, j;

edge=15;

cx=getmaxx () / 2;

cy=getmaxy () / 2;

sx=cx-((count_a / 2)*edge-(edge / 2));

sy=cy-((count_a / 2)*edge-(edge / 2));

fx=sx+count_a*edge;

fy=sy+count_a*edge;

setcolor (RED);

gui->Rectangle (sx, sy, fx, fy);

for (i=1;i<=count_a;i++)

gui->Line (sx+i*edge, sy, sx+i*edge, fy);

for (i=1;i<=count_a;i++)

gui->Line (sx, sy+i*edge, fx, sy+i*edge);

for (i=1;i<=count_a;i++)

{

for (j=1;j<=count_a;j++)

{

if (a[i][j]==1)

gui->Fill (sx+(j*edge)-edge / 2, sy+(i*edge)-edge / 2, RED);

}

}

}

void tLabirint: GetCoords ()

{

/*

start.x=1;

start.y=1;

finish.x=5;

finish.y=4;

*/

FILE *f;

char ch;

int i, j, n;

f = fopen («input.txt», «rt»);

fread (&ch, sizeof (ch), 1, f);

n = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

//Chitat' startovuyu pozitciu: X

fread (&ch, sizeof (ch), 1, f);

start.x = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

//Chitat' startovuyu pozitciu: Y

fread (&ch, sizeof (ch), 1, f);

start.y = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

//Chitat' final’nuyu pozitciu: X

fread (&ch, sizeof (ch), 1, f);

finish.x = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

//Chitat' final’nuyu pozitciu: Y

fread (&ch, sizeof (ch), 1, f);

finish.y = atoi (&ch);

fread (&ch, sizeof (ch), 1, f);

}

void tLabirint: Find ()

{

GetCoords ();

DFS ();

if (flag==0)

outtextxy (20, 440, «No way!»);

else

outtextxy (20, 440, «Found way!»);

}

void main ()

{

tLabirint *lab;

clrscr ();

lab = new tLabirint ();

lab->ReadMatrix ();

lab->DrawLabirint ();

lab->Find ();

/**/

getch ();

delete lab;

}

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ