2 条题解

  • 1
    @ 2025-3-1 11:18:18
    #include <bits/stdc++.h>
    using namespace std;
    
    const int MAXN = 1010;
    const int dx[] = {-1, 1, 0, 0};
    const int dy[] = {0, 0, -1, 1};
    
    int n, m;
    int p[MAXN][MAXN];
    bool visited[MAXN][MAXN];
    
    bool check(int d) {
        memset(visited, false, sizeof(visited));
        queue<pair<int, int>> q;
        for (int j = 1; j <= m; j++) {
            if (p[1][j] <= d) {
                q.push({1, j});
                visited[1][j] = true;
            }
        }
    
    
        while (!q.empty()) {
            auto t = q.front();
            q.pop();
            int x = t.first,y = t.second;
            for (int i = 0; i < 4; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !visited[nx][ny] && p[nx][ny] <= d) {
                    visited[nx][ny] = true;
                    q.push({nx, ny});
                }
            }
        }
    
        for (int j = 1; j <= m; j++) {
            if (!visited[n][j]) {
                return false;
            }
        }
        return true;
    }
    
    int main() {
        cin >> n >> m;
        int maxP = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                cin >> p[i][j];
                maxP = max(maxP, p[i][j]);
            }
        }
    
    
        int left = 0, right = maxP;
        int ans = maxP;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (check(mid)) {
                ans = mid; 
                right = mid - 1; 
            } else {
                left = mid + 1;
            }
        }
    
        cout << ans << endl;
        return 0;
    }
    
    
    • 1
      @ 2025-3-1 10:41:54
      #include <bits/stdc++.h>
      
      using namespace std;
      
      const int N = 1010;
      int dx[4] = {0,0,-1,1},dy[4] = {1,-1,0,0};
      int n,m;
      bitset<N> vis[N];
      int grids[N][N];
      int max1 = 0,ans = 0;
      
      bool f(int x,int y)
      {
        return (x>=1&&x<=n&&y<=m&&y>=1);
      }
      
      
      
      bool dfs(int x,int y ,int s)
      {
        if(x == n)return true;
        vis[x][y] = true;
          for(int j = 0;j<4;j++)
          {
            int nx = x+dx[j],ny = y+dy[j];
            if(f(nx,ny)&&!vis[nx][ny]&&grids[nx][ny]<=s)
            {
              if(dfs(nx,ny,s))
              return true;
            }
          }
          return false;
        }
      
      bool check(int s)
      {
        memset(vis, false, sizeof(vis)); 
          for (int j = 1; j <= m; j++) {
              if (grids[1][j] <= s && dfs(1, j, s)) {
                  return true; 
              }
          }
          return false; 
      }
      int main()
      {
        
        cin>>n>>m;
        for(int i = 1;i<=n;i++)
        for(int j = 1;j<=m;j++)
        {
          cin>>grids[i][j];
          max1 = max(max1,grids[i][j]);
        }
      
        int l = 0,r = max1;
        while(l<=r)
        {
          int mid = (l+r)/2;
          if(check(mid))
          {
            ans = mid;
            r = mid-1;
          }else  {
            l = mid+1;
          }
        }
        cout << ans << endl;
        return 0;
      }
      
      • 1

      信息

      ID
      5957
      时间
      1000ms
      内存
      125MiB
      难度
      3
      标签
      递交数
      22
      已通过
      10
      上传者