Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <climits>
- using namespace std;
- class Mapa{
- public:
- int szer;
- int wys;
- void setSzer(int szer) { this->szer = szer; }
- void setWys(int wys) { this->wys = wys; }
- int getSzer(){ return szer - 1; }
- int getWys(){ return wys - 1; }
- };
- class xy{
- public:
- int x, y;
- };
- class Wyciag{
- int x1, y1, x2, y2;
- int t; //czas trwania podrózy
- int min; //minuty odjazdu - wielokrotnosci min
- bool jest;
- public:
- void setx1(int x1) { this->x1 = x1; }
- void sety1(int y1) { this->y1 = y1; }
- int getx1(){ return x1; }
- int gety1(){ return y1; }
- void setx2(int x2) { this->x2 = x2; }
- void sety2(int y2) { this->y2 = y2; }
- int getx2(){ return x2; }
- int gety2(){ return y2; }
- void setT(int t) { this->t = t; }
- void setMin(int min) { this->min = min; }
- int getT(){ return t; }
- int getMin(){ return min; }
- bool Jest(){ return jest; }
- void setJest(bool jest){ this->jest = jest; }
- };
- class Wezel{
- int x;
- int y;
- int wys;
- bool odwiedzony;
- public:
- void setOdwiedz(bool odw){ this->odwiedzony = odw; }
- bool getOdwiedz(){ return this->odwiedzony; }
- void setX(int x){ this->x = x; }
- int getX(){ return x; }
- void setY(int y){ this->y = y; }
- int getY(){ return y; }
- void setWys(int wysokosc){ wys = wysokosc; }
- int getWys(){ return wys; }
- };
- void Dijkstra(int x, int y, int x1, int y1, int **tablica, Wezel **wezly, Mapa mapa, Wyciag *wyciagi, int h, xy xy);
- int Mniejsza(int a, int b){
- if (a <= b) return a;
- else return b;
- }
- int Czas(int x1, int y1, int x2, int y2, Wezel **wezly, Wyciag *wyciagi, int **tablica, int h){
- if (h){
- int i = 0;
- while (wyciagi[i].Jest()){
- int f = 0;
- if (x1 == wyciagi[i].getx1() && y1 == wyciagi[i].gety1()){
- int czas = wyciagi[i].getMin();
- if (tablica[x1][y1] % czas){
- f = czas - (tablica[x1][y1] % czas);
- }
- int x2 = wyciagi[i].getx2(), y2 = wyciagi[i].gety2();
- tablica[x2][y2] = tablica[x1][y1] + Mniejsza(tablica[x2][y2], wyciagi[i].getT() + f);
- }
- i++;
- }
- }
- int a, b;
- a = wezly[x1][y1].getWys();
- b = wezly[x2][y2].getWys();
- if (a >= b) return 1;
- else if (b > a) return (b - a + 1);
- else return 1;
- }
- xy Szukaj(int x1, int y1, int **tablica, Wezel **wezly, Mapa mapa, xy xy){
- int tmp = INT_MAX;
- int x = 0, y = 0;
- int wys = mapa.getWys(), szer = mapa.getSzer();
- for (int i = 0; i <= wys; i++){
- for (int j = 0; j <= szer; j++){
- if (tablica[j][i] < tmp && !(wezly[j][i].getOdwiedz())){
- tmp = tablica[j][i];
- x = j;
- y = i;
- }
- }
- }
- if (x == x1 && y == y1){
- xy.x = x1;
- xy.y = y1;
- }
- else {
- xy.x = x;
- xy.y = y;
- }
- return xy;
- }
- void Dijkstra(int x, int y, int x1, int y1, int **tablica, Wezel **wezly, Mapa mapa, Wyciag *wyciagi, int h, xy xy){
- wezly[x1][y1].setOdwiedz(false);
- wezly[x][y].setOdwiedz(true);
- {
- int tmp = 0;
- if (y == 0 && x == 0){
- if (!(wezly[x][y + 1].getOdwiedz()))
- {
- tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
- }
- if (!(wezly[x + 1][y].getOdwiedz())){
- tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
- }
- xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
- if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
- else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
- }
- else if (y == mapa.getWys() && x == mapa.getSzer()){
- if (!(wezly[x][y - 1].getOdwiedz()))
- tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
- if (!(wezly[x - 1][y].getOdwiedz()))
- tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
- xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
- if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
- else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
- }
- else if (y == 0 && x == mapa.getSzer()){
- if (!(wezly[x][y + 1].getOdwiedz()))
- tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
- if (!(wezly[x - 1][y].getOdwiedz()))
- tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
- xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
- if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
- else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
- }
- else if (y == mapa.getWys() && x == 0){
- if (!(wezly[x][y - 1].getOdwiedz()))
- tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
- if (!(wezly[x + 1][y].getOdwiedz()))
- tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
- xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
- if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
- else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
- }
- else if (y == mapa.getWys()){
- if (!(wezly[x + 1][y].getOdwiedz()))
- tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h) + tablica[x][y]);
- if (!(wezly[x - 1][y].getOdwiedz()))
- tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h) + tablica[x][y]);
- if (!(wezly[x][y - 1].getOdwiedz()))
- tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h) + tablica[x][y]);
- xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
- if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
- else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
- }
- else if (y == 0){
- if (!(wezly[x + 1][y].getOdwiedz()))
- tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
- if (!(wezly[x - 1][y].getOdwiedz()))
- tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
- if (!(wezly[x][y + 1].getOdwiedz()))
- tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
- xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
- if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
- else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
- }
- else if (x == mapa.getSzer()){
- if (!(wezly[x][y + 1].getOdwiedz()))
- tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
- if (!(wezly[x - 1][y].getOdwiedz()))
- tablica[x - 1][y] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
- if (!(wezly[x][y - 1].getOdwiedz()))
- tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
- xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
- if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
- else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
- }
- else if (x == 0){
- if (!(wezly[x][y + 1].getOdwiedz()))
- tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
- if (!(wezly[x][y - 1].getOdwiedz()))
- tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
- if (!(wezly[x + 1][y].getOdwiedz()))
- tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
- xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
- if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
- else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
- }
- else {
- if (!(wezly[x + 1][y].getOdwiedz()))
- tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
- if (!(wezly[x - 1][y].getOdwiedz()))
- tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
- if (!(wezly[x][y + 1].getOdwiedz()))
- tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
- if (!(wezly[x][y - 1].getOdwiedz()))
- tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
- xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
- if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
- else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
- }
- }
- }
- int main()
- {
- Mapa mapa;
- xy xy;
- xy.x = 0;
- xy.y = 0;
- int tmp;
- scanf("%d", &tmp);
- mapa.setSzer(tmp);
- scanf("%d", &tmp);
- mapa.setWys(tmp);
- int x1, y1, x2, y2, il_wyciagow = 0;
- scanf("%d", &x1);
- scanf("%d", &y1);
- scanf("%d", &x2);
- scanf("%d", &y2);
- scanf("%d", &il_wyciagow);
- int n = 0;
- Wyciag *wyciagi = new Wyciag[il_wyciagow];
- while (n < il_wyciagow){
- wyciagi[n].setJest(true);
- scanf("%d", &tmp);
- wyciagi[n].setx1(tmp);
- scanf("%d", &tmp);
- wyciagi[n].sety1(tmp);
- scanf("%d", &tmp);
- wyciagi[n].setx2(tmp);
- scanf("%d", &tmp);
- wyciagi[n].sety2(tmp);
- scanf("%d", &tmp);
- wyciagi[n].setT(tmp);
- scanf("%d", &tmp);
- wyciagi[n].setMin(tmp);
- n++;
- }
- int h = il_wyciagow;
- char cmd;
- int l;
- int wys = mapa.getWys(), szer = mapa.getSzer();
- int **tablica = new int*[szer + 1];
- Wezel **wezly = new Wezel*[szer + 1];
- for (int i = 0; i <= szer; i++){
- tablica[i] = new int[wys + 1];
- wezly[i] = new Wezel[wys + 1];
- }
- for (int i = 0; i <= wys; i++){
- for (int j = 0; j <= szer; j++){
- scanf("%d", &tmp);
- wezly[j][i].setOdwiedz(false);
- wezly[j][i].setWys(tmp);
- tablica[j][i] = INT_MAX;
- }
- }
- tablica[x1][y1] = 0;
- Dijkstra(x1, y1, x2, y2, tablica, wezly, mapa, wyciagi, h, xy);
- for (int i = 0; i <= szer; i++){
- delete tablica[i];
- delete wezly[i];
- }
- delete tablica;
- delete wezly;
- delete wyciagi;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement