Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- #include <cstring>
- #include <queue>
- using namespace std;
- int n,m;
- char input[101][101]; // Графот како што го читаме на инпут
- int rooms[101][101]; // Означувам која координата на која просторија припаѓа
- int nextRoom = 1;
- int startRoom; // Во која просторија се наоѓа S
- int finishRoom; // Во која просторија се наоѓа H
- // Наместо да пишувам 4 if-а за да иде dfs-то во 4 насоки, со ова се пишува помалку код
- int xd[] = {0, 0, -1, 1};
- int yd[] = {1, -1, 0, 0};
- void ff(int x, int y, int room) // ff(x, y, room) ја поставува координатата x, y да припаѓа на просторијата room
- {
- rooms[x][y] = room;
- if(input[x][y] == 'S')
- startRoom = room;
- if(input[x][y] == 'H')
- finishRoom = room;
- for(int d = 0 ; d < 4 ; ++d)
- {
- if(x + xd[d] >= 0 && x + xd[d] < n && y + yd[d] >= 0 && y + yd[d] < m)
- {
- int xx = x + xd[d];
- int yy = y + yd[d];
- if(input[xx][yy] != '|' && input[xx][yy] != '-' && input[xx][yy] != 'F' && !rooms[xx][yy] && input[xx][yy] != '*')
- ff(xx, yy, room);
- }
- }
- }
- vector<int> graph[10001];
- int main()
- {
- scanf("%d%d",&n,&m);
- for(int i = 0 ; i < n ; ++i)
- for(int j = 0 ; j < m ; ++j)
- scanf(" %c", &input[i][j]);
- // За сите координати што не се препрека / улица и немаат просторија, им поставува просторија и повикува flood fill
- for(int i = 0 ; i < n ; ++i)
- for(int j = 0 ; j < m ; ++j)
- if(!rooms[i][j] && input[i][j] != '|' && input[i][j] != 'F' && input[i][j] != '-' && input[i][j] != '*')
- ff(i, j, nextRoom++);
- // Многу ружен код што наоѓа која просторија со која е поврзана и генерира граф како adjacency list
- for(int i = 0 ; i < n ; ++i)
- for(int j = 0 ; j < m ; ++j)
- {
- if(!rooms[i][j])
- continue;
- for(int d = 0 ; d < 4 ; ++d)
- {
- int dist = 1;
- int xx = i + xd[d]*dist;
- int yy = j + yd[d]*dist;
- while(xx >= 0 && xx < n && yy >= 0 && yy < m)
- {
- if(input[xx][yy] == '.' || input[xx][yy] == 'S' || input[xx][yy] == 'H')
- {
- if(rooms[xx][yy] != rooms[i][j])
- if(find(graph[rooms[xx][yy]].begin(), graph[rooms[xx][yy]].end(), rooms[i][j]) == graph[rooms[xx][yy]].end())
- {
- graph[rooms[xx][yy]].push_back(rooms[i][j]);
- graph[rooms[i][j]].push_back(rooms[xx][yy]);
- }
- break;
- }
- else if((input[xx][yy] == '|' && d <= 1) || (input[xx][yy] == '-' && d >= 2))
- {
- ++dist;
- xx = i + xd[d]*dist;
- yy = j + yd[d]*dist;
- }
- else
- break;
- }
- }
- }
- // Останува само обичен BFS за да се добие резултатот
- queue<int> Q;
- int dist[10001];
- bool visited[10001];
- memset(dist, -1, sizeof(dist));
- memset(visited, false, sizeof(visited));
- Q.push(startRoom);
- visited[startRoom] = true;
- dist[startRoom] = 0;
- while(!visited[finishRoom] && !Q.empty())
- {
- int curr = Q.front();
- Q.pop();
- for(int i = 0 ; i < graph[curr].size() ; ++i)
- if(!visited[graph[curr][i]])
- {
- visited[graph[curr][i]] = true;
- dist[graph[curr][i]] = dist[curr] + 1;
- Q.push(graph[curr][i]);
- }
- }
- printf("%d", dist[finishRoom]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement