Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <queue>
- #include <vector>
- #include <limits.h>
- #include <cmath>
- using namespace std;
- struct Point {
- int x, y, time, cost;
- bool operator>(const Point& other) const {
- return time > other.time || (time == other.time && cost > other.cost);
- }
- };
- int r, k, m, t;
- vector<vector<char>> city;
- vector<Point> metroStations;
- int dx[] = {-1, 1, 0, 0};
- int dy[] = {0, 0, -1, 1};
- int bfs(int startX, int startY, int endX, int endY) {
- priority_queue<Point, vector<Point>, greater<Point>> pq;
- vector<vector<vector<int>>> visited(r, vector<vector<int>>(k, vector<int>(2, INT_MAX)));
- pq.push({startX, startY, 0, 0});
- visited[startX][startY][0] = 0;
- while (!pq.empty()) {
- Point current = pq.top();
- pq.pop();
- int x = current.x, y = current.y, time = current.time, cost = current.cost;
- if (x == endX && y == endY) return cost;
- for (int i = 0; i < 4; i++) {
- int nx = x + dx[i];
- int ny = y + dy[i];
- if (nx >= 0 && nx < r && ny >= 0 && ny < k && city[nx][ny] != '#') {
- int newCost = cost;
- int newTime = time + 5;
- if (city[nx][ny] == 'M') newTime = time + 1;
- if (visited[nx][ny][0] > newTime) {
- pq.push({nx, ny, newTime, newCost});
- visited[nx][ny][0] = newTime;
- }
- }
- }
- }
- return -1;
- }
- int main() {
- cin >> r >> k >> m >> t;
- city.resize(r, vector<char>(k));
- int startX, startY, endX, endY;
- for (int i = 0; i < r; i++) {
- for (int j = 0; j < k; j++) {
- cin >> city[i][j];
- if (city[i][j] == 'T') {
- startX = i;
- startY = j;
- }
- if (city[i][j] == 'K') {
- endX = i;
- endY = j;
- }
- }
- }
- cout << bfs(startX, startY, endX, endY) << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement