Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <deque>
- #include <stdio.h>
- #include <string>
- using namespace::std;
- const int N = 505;
- char tab[N][N];
- int n, m, rezult = N * N, ruch_x[] = {0, 1, 0, -1}, ruch_y[] = {1, 0, -1, 0};
- pair<int, int> delta, start, meta;
- struct dana { int x, y, dx, dy, wynik; };
- deque<dana> kolejka;
- bool zlewa[N][N], zprawa[N][N], zdolu[N][N], zgory[N][N];
- bool mozna(int x1, int y1, int x2, int y2) {
- x1 *= 2; y1 *= 2; x2 *= 2; y2 *= 2;
- if(x1 < 1 || x2 < 1 || x1 > 2 * m+1 || x2 > 2 * m + 1 || y1 < 1 || y2 < 1 || y1 > 2 * n +1 || y2 > 2 * n + 1) return false;
- if(tab[(x1+x2)/2][(y1+y2)/2] == '.') return true;
- return false;
- }
- bool wchodze(int x, int y, int dx, int dy) {
- if(dx > 0 && zlewa[x+dx][y+dy]) return false;
- if(dx < 0 && zprawa[x+dx][y+dy]) return false;
- if(dy > 0 && zdolu[x+dx][y+dy]) return false;
- if(dy < 0 && zgory[x+dx][y+dy]) return false;
- return true;
- }
- pair<int, int> prawo() {
- if(delta.first > 0) return make_pair(0, -1);
- if(delta.first < 0) return make_pair(0, 1);
- if(delta.second > 0) return make_pair(1, 0);
- if(delta.second < 0) return make_pair(-1, 0);
- }
- int dupa = 0;
- void DFS(int x, int y, int w) {
- //if(dupa > 50) return;
- if(delta.first > 0) {
- if(zlewa[x][y]) return;
- }
- else if(delta.first < 0) {
- if(zprawa[x][y]) return;
- }
- else if(delta.second > 0) {
- if(zdolu[x][y]) return;
- }
- else if(delta.second < 0) {
- if(zgory[x][y]) return;
- }
- //cout << x << " " << y << " " << delta.first << " " << delta.second << " ";
- if(delta.first > 0) {
- zlewa[x][y] = true;
- //cout << "z lewa";
- }
- else if(delta.first < 0) {
- zprawa[x][y] = true;
- //cout << "z prawa";
- }
- else if(delta.second > 0) {
- zdolu[x][y] = true;
- //cout << "z dolu";
- }
- else if(delta.second < 0) {
- zgory[x][y] = true;
- //cout << "z gory";
- }
- //cout << endl;
- //dupa++;
- if(x==meta.first && y==meta.second) {
- rezult = min(rezult, w);
- //cout << "WWWWWW: " << w << endl;
- }
- //if(x==3 && y == 2) cout << "MAM: " << w << endl;
- pair<int, int> d_prawo = prawo();
- if(mozna(x, y, x+delta.first, y + delta.second)) {
- if(wchodze(x, y, delta.first, delta.second)) DFS(x+delta.first, y+delta.second, w);
- //if(x==5 && y==5)
- //cout << "DUPA: " << x << " " << y << " " << delta.first << " " << delta.second << endl;
- } else if(mozna(x, y, x+d_prawo.first, y+d_prawo.second)) {
- delta = {d_prawo.first, d_prawo.second};
- if(wchodze(x, y, delta.first, delta.second)) DFS(x+d_prawo.first, y+d_prawo.second, w);
- }
- else if(mozna(x, y, x-d_prawo.first, y-d_prawo.second)) {
- delta = {-d_prawo.first, -d_prawo.second};
- if(wchodze(x, y, delta.first, delta.second)) DFS(x+delta.first, y+delta.second, w);
- }
- else if(mozna(x, y, x-delta.first, y-delta.second)) {
- delta.first *= -1;
- delta.second *= -1;
- if(wchodze(x, y, delta.first, delta.second)) DFS(x+delta.first, y+delta.second, w);
- }
- for(int i = 0; i < 4; i++) {
- if(mozna(x, y, x+ruch_x[i], y+ruch_y[i]) && wchodze(x, y, ruch_x[i], ruch_y[i]))
- kolejka.push_back({x+ruch_x[i], y+ruch_y[i], ruch_x[i], ruch_y[i], w+1});
- }
- }
- bool odwiedzony[N][N];
- void dfs(int x, int y) {
- odwiedzony[x][y] = true;
- for(int i = 0; i < 4; i++)
- if(mozna(x, y, x+ruch_x[i], y+ruch_y[i]) && !odwiedzony[x+ruch_x[i]][y+ruch_y[i]]) dfs(x+ruch_x[i], y+ruch_y[i]);
- }
- string strona = "";
- //string numer = "5";
- int main() {
- //freopen("Rakieta/90.in", "r", stdin);
- cin >> n >> m >> strona;
- for(int i = 2*n+1; i >= 1; i--) {
- string wiersz;
- cin >> wiersz;
- for(int j = 0; j < 2 * m + 1; j++) {
- tab[j+1][i] = wiersz[j];
- if(tab[j+1][i] == 'S') {
- start = {(j+1)/2, i/2};
- tab[j+1][i] = '.';
- } else if(tab[j+1][i] == 'R') {
- meta = {(j+1)/2, i/2};
- tab[j+1][i] = '.';
- }
- }
- }
- //cout << start.first << " " << start.second << endl;
- //cout << n << " " << m << endl;
- if(strona=="GORA") delta = {0, 1};
- else if(strona == "PRAWO") delta = {1, 0};
- else if(strona == "DOL") delta = {0, -1};
- else if(strona == "LEWO") delta = {-1, 0};
- dfs(start.first, start.second);
- if(!odwiedzony[meta.first][meta.second]) {
- cout << "-1";
- return 0;
- }
- kolejka.push_back({start.first, start.second, delta.first, delta.second, 0});
- //kolejka.push_back({3, 3, -1, 0, 1});
- //kolejka.push_back({3, 4, 1, 0, 0});
- //kolejka.push_back({3, 5, 0, -1, 0});
- while(!kolejka.empty()) {
- //cout << "Start: " << kolejka.front().x << " " << kolejka.front().y << " " << kolejka.front().dx << " " << kolejka.front().dy << " " << kolejka.front().wynik << endl;
- delta = {kolejka.front().dx, kolejka.front().dy};
- DFS(kolejka.front().x, kolejka.front().y, kolejka.front().wynik);
- kolejka.pop_front();
- //cout << endl;
- }
- //cout << "DUPA: " << dupa << endl;
- cout << rezult;
- //delta = {1, 0};
- //DFS(3, 4);
- /*for(int y = 2 * n + 1; y >= 1; y--) {
- for(int x = 1; x <= 2 *m+1; x++) cout << tab[x][y];
- cout << endl;
- }
- while(true) {
- int x1, y1, x2, y2;
- cin >> x1 >> y1 >> x2 >> y2;
- cout << mozna(x1, y1, x2, y2) << endl;
- }*/
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement