Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- using namespace std;
- #define NIESKONCZONOSC 2147483647
- int obliczKoszt(int a, int b)
- {
- if (a > b)
- return 1;
- return
- b - a + 1;
- }
- int znajdzNajmniejszy(int czasy[], bool odwiedzone[], int ilosc)
- {
- int min = NIESKONCZONOSC;
- int min_index = -1;
- for (int i = 0; i < ilosc; i++)
- {
- if (odwiedzone[i] == false && czasy[i] <= min)
- {
- min = czasy[i];
- min_index = i;
- }
- }
- return min_index;
- }
- int main()
- {
- int mapa_szerokosc;
- int mapa_wysokosc;
- int start_x;
- int start_y;
- int koniec_x;
- int koniec_y;
- int ilosc_wyciagow;
- scanf("%d", &mapa_szerokosc);
- scanf("%d", &mapa_wysokosc);
- scanf("%d", &start_x);
- scanf("%d", &start_y);
- scanf("%d", &koniec_x);
- scanf("%d", &koniec_y);
- scanf("%d", &ilosc_wyciagow);
- int ilosc = mapa_wysokosc * mapa_szerokosc;
- int index_start = start_y * mapa_szerokosc + start_x;
- int index_docelowy = koniec_y * mapa_szerokosc + koniec_x;
- int* wierzcholki = new int[ilosc];
- int* czasy = new int[ilosc];
- bool* odwiedzone = new bool[ilosc];
- for (int i = 0; i < ilosc; i++)
- scanf("%d", &wierzcholki[i]);
- for (int i = 0; i < ilosc; i++)
- {
- odwiedzone[i] = false;
- czasy[i] = NIESKONCZONOSC;
- }
- czasy[0] = 0;
- printf("\n");
- while (odwiedzone[index_docelowy] == false)
- {
- for (int i = 0; i < ilosc; i++)
- {
- if (i % mapa_szerokosc == 0)
- printf("\n");
- if (czasy[i] == NIESKONCZONOSC)
- printf("INF\t");
- else
- printf("%d\t", czasy[i]);
- }
- printf("\n");
- int wierzcholek = znajdzNajmniejszy(czasy, odwiedzone, ilosc);
- odwiedzone[wierzcholek] = true;
- for (int i = 0; i < 4; i++)
- {
- int sasiad = -1;
- if (wierzcholek + 1 < ilosc)
- sasiad = wierzcholek + 1;
- if (sasiad != -1 && odwiedzone[sasiad] == false)
- {
- if (czasy[wierzcholek] + obliczKoszt(wierzcholki[wierzcholek], wierzcholki[sasiad]) < czasy[sasiad])
- czasy[sasiad] = czasy[wierzcholek] + obliczKoszt(wierzcholki[wierzcholek], wierzcholki[sasiad]);
- }
- else if (wierzcholek - 1 >= 0)
- sasiad = wierzcholek - 1;
- if (sasiad != -1 && odwiedzone[sasiad] == false)
- {
- if (czasy[wierzcholek] + obliczKoszt(wierzcholki[wierzcholek], wierzcholki[sasiad]) < czasy[sasiad])
- czasy[sasiad] = czasy[wierzcholek] + obliczKoszt(wierzcholki[wierzcholek], wierzcholki[sasiad]);
- }
- else if (wierzcholek + mapa_szerokosc < ilosc)
- sasiad = wierzcholek + mapa_szerokosc;
- if (sasiad != -1 && odwiedzone[sasiad] == false)
- {
- if (czasy[wierzcholek] + obliczKoszt(wierzcholki[wierzcholek], wierzcholki[sasiad]) < czasy[sasiad])
- czasy[sasiad] = czasy[wierzcholek] + obliczKoszt(wierzcholki[wierzcholek], wierzcholki[sasiad]);
- }
- else if (wierzcholek - mapa_szerokosc >= 0)
- sasiad = wierzcholek - mapa_szerokosc;
- if (sasiad != -1 && odwiedzone[sasiad] == false)
- {
- if (czasy[wierzcholek] + obliczKoszt(wierzcholki[wierzcholek], wierzcholki[sasiad]) < czasy[sasiad])
- czasy[sasiad] = czasy[wierzcholek] + obliczKoszt(wierzcholki[wierzcholek], wierzcholki[sasiad]);
- }
- }
- }
- for (int i = 0; i < ilosc; i++)
- {
- if (i % mapa_szerokosc == 0)
- printf("\n");
- printf("%d\t", czasy[index_docelowy]);
- }
- printf("\n");
- delete[] czasy;
- delete[] wierzcholki;
- delete[] odwiedzone;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement