You are on page 1of 10

#include <iostream>

#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

using namespace std;

struct graf
{
int wartosc_komorki = 0;
int ruch = 0;
graf* gora;
graf* lewo;
graf* prawo;
graf* dol;
bool visited;
int poprzednik;
};

graf tab[40][20];

void uzupelnianie_planszy_segmentami(int** plansza);


void wyznaczanie_polozenia_a_b(int** plansza, int* A_wspx, int* A_wspy, int*
B_wspx, int* B_wspy, int liczba_kolumn, int liczba_wierszy);
void wyswietlenie_wspolrzednych_a_b(int* A_wspx, int* A_wspy, int* B_wspx, int*
B_wspy);
void uzupelnianie_struktur(graf tab[40][20]);
void wierzcholek_grafu(int* A_wspx, int* A_wspy, graf tab[40][20], int
kolejeczka[2][100]);
void wyswietlanie_ilosci_ruchow_i_trasy(int A_wspx, int A_wspy, int B_wspx, int
B_wspy, int ktory_ruch, int C_wspx, int C_wspy, graf tab[40][20], int** plansza);

//graf//
void budowanie_grafu(int liczba_kolumn, int liczba_wierszy, int*
elementy_w_kolejce, int* ktory_ruch, int* C_wspx, int* C_wspy, graf tab[40][20],
int** plansza, int kolejeczka[2][100]);
void dodawanie_do_kolejki(int* ktory_ruch, int kolejeczka[2][100], graf tab[40]
[20], int* elementy_w_kolejce);
//graf//

void wyswietlanie_planszy(int** plansza, int liczba_kolumn, int liczba_wierszy);

int main()
{
srand(static_cast<unsigned int>(time(nullptr)));

// ZMIENNE //
int liczba_kolumn = 20;
int liczba_wierszy = 40;

int A_wspx;
int A_wspy;
int B_wspx;
int B_wspy;

int ktory_ruch = 0;
int elementy_w_kolejce = 1;
int C_wspx;
int C_wspy;
// ZMIENNE //

// DEKLARACJA TABLIC //
int** plansza = new int* [liczba_wierszy];
for (int i = 0; i < liczba_wierszy; i++)
{
plansza[i] = new int[liczba_kolumn];
}

int kolejeczka[2][100];
// DEKLARACJA TABLIC //

//FUNKCJE//
uzupelnianie_planszy_segmentami(plansza);

wyznaczanie_polozenia_a_b(plansza, &A_wspx, &A_wspy, &B_wspx, &B_wspy,


liczba_kolumn, liczba_wierszy);

wyswietlenie_wspolrzednych_a_b(&A_wspx, &A_wspy, &B_wspx, &B_wspy);

uzupelnianie_struktur(tab);

wierzcholek_grafu(&A_wspx, &A_wspy, tab, kolejeczka);

budowanie_grafu(liczba_kolumn, liczba_wierszy, &elementy_w_kolejce,


&ktory_ruch, &C_wspx, &C_wspy, tab, plansza, kolejeczka);

wyswietlanie_ilosci_ruchow_i_trasy(A_wspx, A_wspy, B_wspx, B_wspy, ktory_ruch,


C_wspx, C_wspy, tab, plansza);

wyswietlanie_planszy(plansza, liczba_kolumn, liczba_wierszy);


//FUNKCJE//

// ZWALNIANIE PAMIECI //
for (int i = 0; i < liczba_wierszy; i++)
{
delete[] plansza[i];
}
delete[] plansza;
// ZWALNIANIE PAMIECI //

return 1;
}

void wyznaczanie_polozenia_a_b(int** plansza, int* A_wspx, int* A_wspy, int*


B_wspx, int* B_wspy, int liczba_kolumn, int liczba_wierszy)
{
do
{
*A_wspx = rand() % liczba_kolumn;
*A_wspy = rand() % liczba_wierszy;
} while (plansza[*A_wspy][*A_wspx] != 1);

do
{
*B_wspx = rand() % liczba_kolumn;
*B_wspy = rand() % liczba_wierszy;
} while (plansza[*B_wspy][*B_wspx] != 1 || (*B_wspx == *A_wspx && *B_wspy ==
*A_wspy));

// Umieszczenie liczb 3 i 4 w tablicy


plansza[*A_wspy][*A_wspx] = 2;
plansza[*B_wspy][*B_wspx] = 3;
}

void uzupelnianie_planszy_segmentami(int** plansza)


{
int tabliczka_a[5][5] = {
{0, 0, 1, 0, 0},
{0, 1, 1, 0, 0},
{1, 1, 0, 1, 1},
{0, 1, 1, 1, 0},
{0, 0, 1, 0, 0} };

int tabliczka_b[5][5] = {
{0, 0, 1, 1, 0},
{1, 0, 0, 1, 0},
{1, 1, 1, 1, 1},
{0, 1, 1, 1, 0},
{0, 0, 1, 1, 0} };

int tabliczka_c[5][5] = {
{1, 1, 1, 1, 1},
{1, 1, 0, 1, 1},
{1, 1, 0, 0, 1},
{0, 1, 0, 0, 0},
{0, 1, 1, 1, 1} };

int tabliczka_d[5][5] = {
{0, 0, 1, 1, 1},
{0, 1, 1, 0, 1},
{1, 1, 0, 1, 1},
{1, 0, 1, 1, 0},
{0, 1, 1, 0, 0} };

int tabliczka_e[5][5] = {
{1, 1, 1, 0, 0},
{0, 1, 1, 1, 0},
{1, 1, 0, 1, 1},
{1, 1, 0, 1, 1},
{1, 1, 1, 1, 0} };

int tabliczka_f[5][5] = {
{0, 0, 1, 0, 0},
{0, 0, 1, 0, 0},
{1, 1, 1, 1, 1},
{0, 0, 1, 0, 0},
{0, 0, 1, 0, 0} };
int losowanySegment;
cout << "WYLOSOWANE SEGMENTY: " << endl;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 4; j++)
{
losowanySegment = rand() % 6 + 1;
switch (losowanySegment)
{
case 1:
cout << "A ";
for (int k = 0; k < 5; k++)
{
for (int l = 0; l < 5; l++)
{
plansza[(i * 5 + k)][(j * 5 + l)] = tabliczka_a[k][l];
}
}
break;

case 2:
cout << "B ";
for (int k = 0; k < 5; k++)
{
for (int l = 0; l < 5; l++)
{
plansza[(i * 5 + k)][(j * 5 + l)] = tabliczka_b[k][l];
}
}
break;

case 3:
cout << "C ";
for (int k = 0; k < 5; k++)
{
for (int l = 0; l < 5; l++)
{
plansza[(i * 5 + k)][(j * 5 + l)] = tabliczka_c[k][l];
}
}
break;
case 4:
cout << "D ";
for (int k = 0; k < 5; k++)
{
for (int l = 0; l < 5; l++)
{
plansza[(i * 5 + k)][(j * 5 + l)] = tabliczka_d[k][l];
}
}
break;

case 5:
cout << "E ";
for (int k = 0; k < 5; k++)
{
for (int l = 0; l < 5; l++)
{
plansza[(i * 5 + k)][(j * 5 + l)] = tabliczka_e[k][l];
}
}
break;

case 6:
cout << "F ";
for (int k = 0; k < 5; k++)
{
for (int l = 0; l < 5; l++)
{
plansza[(i * 5 + k)][(j * 5 + l)] = tabliczka_f[k][l];
}
}
break;

default:
cout << "BLAD";
break;
}
}
cout << endl;
}
}

void wyswietlanie_planszy(int** plansza, int liczba_kolumn, int liczba_wierszy)


{
cout << " ";
for (int k = 0; k < liczba_kolumn; k++) {
cout << setw(3) << right << k << " ";
}
cout << endl;
for (int j = 0; j < liczba_wierszy; j++)
{
cout << " ";
for (int k = 0; k < liczba_kolumn; k++)
{
cout << char(218) << char(196) << char(196) << char(196) << char(191);
}
cout << endl;
cout << setw(4) << right << j << " ";
for (int k = 0; k < liczba_kolumn; k++)
{
if (plansza[j][k] == 0)
{
cout << char(179) << char(219) << char(219) << char(219) <<
char(179);
}
else if (plansza[j][k] == 1)
{
cout << char(179) << " " << char(179);
}
else if (plansza[j][k] == 2)
{
cout << char(179) << " A " << char(179);
}
else if (plansza[j][k] == 4)
{
cout << char(179) << " x " << char(179);
}
else
{
cout << char(179) << " B " << char(179);
}
}
cout << endl;
cout << " ";
for (int k = 0; k < liczba_kolumn; k++)
{
cout << char(192) << char(196) << char(196) << char(196) << char(217);
}
cout << endl;
}
}

void dodawanie_do_kolejki(int* ktory_ruch, int kolejeczka[2][100], graf tab[40]


[20], int* elementy_w_kolejce)
{
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 100; j++)
{ // usuwanie kolejki
kolejeczka[i][j] = 0;
}
}
*elementy_w_kolejce = 0;

int miejsce_w_kolejce = 0;

for (int i = 0; i < 40; i++)


{
for (int j = 0; j < 20; j++)
{
if (tab[i][j].ruch == *ktory_ruch)
{
kolejeczka[0][miejsce_w_kolejce] = i;
kolejeczka[1][miejsce_w_kolejce] = j;
miejsce_w_kolejce += 1;
*elementy_w_kolejce += 1;
}
}
}
}

void wyswietlenie_wspolrzednych_a_b(int* A_wspx, int* A_wspy, int* B_wspx, int*


B_wspy) {
cout << endl
<< " A: wiersz: " << *A_wspy << ", kolumna: " << *A_wspx;
cout << endl
<< " B: wiersz: " << *B_wspy << ", kolumna: " << *B_wspx << endl;
}

void uzupelnianie_struktur(graf tab[40][20]) {


for (int i = 0; i < 40; ++i)
{
for (int j = 0; j < 20; ++j)
{
tab[i][j].wartosc_komorki = (i * 20 + j);
tab[i][j].gora = nullptr;
tab[i][j].lewo = nullptr;
tab[i][j].prawo = nullptr;
tab[i][j].dol = nullptr;
tab[i][j].poprzednik = 0;
tab[i][j].visited = 0;
tab[i][j].ruch = 0;
}
}
}

void wierzcholek_grafu(int* A_wspx, int* A_wspy, graf tab[40][20], int


kolejeczka[2][100]) {
kolejeczka[0][0] = *A_wspy;
kolejeczka[1][0] = *A_wspx;
tab[*A_wspy][*A_wspx].visited = 1;
}

void wyswietlanie_ilosci_ruchow_i_trasy(int A_wspx, int A_wspy, int B_wspx, int


B_wspy, int ktory_ruch, int C_wspx, int C_wspy, graf tab[40][20], int** plansza) {
cout << endl
<< " Ilosc ruchow: " << ktory_ruch << endl << endl;

cout << " Trasa: ";


cout << " B -> (" << B_wspy << " , " << B_wspx << ") ";
int zamiennik_y = 0;
int zamiennik_x = 0;
for (int k = 0; k < ktory_ruch - 1; k++) {
if (k % 11 == 10) {
cout << endl << " ";
}
cout << "(" << C_wspy << " , " << C_wspx << ") ";
plansza[C_wspy][C_wspx] = 4;//oznaczenie 'x' //
zamiennik_y = tab[C_wspy][C_wspx].poprzednik / 20;
zamiennik_x = tab[C_wspy][C_wspx].poprzednik % 20;
C_wspy = zamiennik_y;
C_wspx = zamiennik_x;
}
cout << "(" << A_wspy << " , " << A_wspx << ") <- A" << endl << endl << endl;
}

void budowanie_grafu(int liczba_kolumn, int liczba_wierszy, int*


elementy_w_kolejce, int* ktory_ruch, int* C_wspx, int* C_wspy, graf tab[40][20],
int** plansza, int kolejeczka[2][100]) {
int i = 0;
int j = 0;
bool czy_wykrylo = 1;

while (czy_wykrylo)
{
if (elementy_w_kolejce != 0)
{
for (int k = 0; k < *elementy_w_kolejce; k++)
{
i = kolejeczka[0][k];
j = kolejeczka[1][k];
if (czy_wykrylo)
{
if (i != 0)
{
if (plansza[i - 1][j] != 3)
{ // mozna isc w gore
if (plansza[i - 1][j] != 0)
{ // nie jest czarne pole//
if (tab[i - 1][j].visited != 1)
{ // nie zostalo
odwiedzone//
tab[i - 1][j].visited = 1; // komorka juz
odwiedzona
tab[i - 1][j].poprzednik = tab[i]
[j].wartosc_komorki;
tab[i - 1][j].ruch = *ktory_ruch + 1;
tab[i][j].gora = &tab[i - 1][j];
}
}
}

else
{
czy_wykrylo = 0;
*C_wspx = j; // kolumna//
*C_wspy = i; // wiersz//
break;
}
}
}
if (czy_wykrylo)
{
if (j != 0)
{
if (plansza[i][j - 1] != 3)
{ // mozna isc w lewo
if (plansza[i][j - 1] != 0)
{ // nie jest czarne pole//
if (tab[i][j - 1].visited != 1)
{ // nie zostalo
odwiedzone//
tab[i][j - 1].visited = 1; // komorka juz
odwiedzona
tab[i][j - 1].poprzednik = tab[i]
[j].wartosc_komorki;
tab[i][j - 1].ruch = *ktory_ruch + 1;
tab[i][j].lewo = &tab[i][j - 1];
}
}
}

else
{
czy_wykrylo = 0;
*C_wspx = j; // kolumna//
*C_wspy = i; // wiersz//
break;
}
}
}

if (czy_wykrylo)
{
if (j != (liczba_kolumn - 1))
{
if (plansza[i][j + 1] != 3)
{ // mozna isc w prawo
if (plansza[i][j + 1] != 0)
{ // nie jest czarne pole//
if (tab[i][j + 1].visited != 1)
{ // nie zostalo
odwiedzone//
tab[i][j + 1].visited = 1; // komorka juz
odwiedzona
tab[i][j + 1].poprzednik = tab[i]
[j].wartosc_komorki;
tab[i][j + 1].ruch = *ktory_ruch + 1;
tab[i][j].prawo = &tab[i][j + 1];
}
}
}

else
{
czy_wykrylo = 0;
*C_wspx = j; // kolumna//
*C_wspy = i; // wiersz//
break;
}
}
}
if (czy_wykrylo)
{
if (i != (liczba_wierszy - 1))
{
if (plansza[i + 1][j] != 3)
{ // mozna isc w dol
if (plansza[i + 1][j] != 0)
{ // nie jest czarne pole//
if (tab[i + 1][j].visited != 1)
{ // nie zostalo
odwiedzone//
tab[i + 1][j].visited = 1; // komorka juz
odwiedzona
tab[i + 1][j].poprzednik = tab[i]
[j].wartosc_komorki;
tab[i + 1][j].ruch = *ktory_ruch + 1;
tab[i][j].dol = &tab[i + 1][j];
}
}
}

else
{
czy_wykrylo = 0;
*C_wspx = j; // kolumna//
*C_wspy = i; // wiersz//
break;
}
}
}
}
*ktory_ruch += 1;
dodawanie_do_kolejki(ktory_ruch, kolejeczka, tab, elementy_w_kolejce);
}
}
}

You might also like