Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Bơi trong nước dâng (Swim in Rising Water) trong C++

Lưới N x N, grid[i][j] = độ cao. Nước dارتفاع theo thời gian t. Có thể bơi từ ô sang ô lân cận 4 hướng nếu độ cao cả 2 ≤ t. Tìm t nhỏ nhất từ (0,0) đến (N-1,N-1).

Ví dụ

Lưới 5x5 cho trước → kết quả 16.

Thuật toán Dijkstra / BFS ưu tiên

Trạng thái: (time, x, y) với time = max(độ cao trên đường đi). Dùng priority queue lấy trạng thái time nhỏ nhất. Đi đến ô mới: newTime = max(time, grid[nx][ny]). Duyệt cho đến khi đến đích.

Chương trình C++

#include <bits/stdc++.h>
using namespace std;

struct Data { int time, x, y; Data(int t,int x,int y):time(t),x(x),y(y){} };
struct Cmp { bool operator()(Data a, Data b){ return !(a.time < b.time); } };
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};

class Solution {
public:
    int swimInWater(vector<vector<int>>& grid) {
        int n = grid.size(), m = grid[0].size();
        priority_queue<Data, vector<Data>, Cmp> pq;
        vector<vector<int>> vis(n, vector<int>(m,0));
        vis[0][0]=1;
        pq.push(Data(grid[0][0],0,0));
        while(!pq.empty()) {
            Data cur = pq.top(); pq.pop();
            if(cur.x == n-1 && cur.y == m-1) return cur.time;
            for(auto& d : dir) {
                int nx = cur.x + d[0], ny = cur.y + d[1];
                if(nx>=0 && nx=0 && ny