Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
134826 谢思涵 引水入城 C++ 通过 100 48 MS 9496 KB 1260 2024-03-02 21:03:53

Tests(10/10):


#include <iostream> #include <cstring> using namespace std; int dx[10] = {0, -1, 0, 1, 0}, dy[10] = {0, 0, 1, 0, -1}; int l[510][510], r[510][510], h[510][510]; int n, m, ans; bool v[510][510], can = false; void dfs(int x,int y) { v[x][y] = true; for (int i = 1; i <= 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if(nx < 1 || nx > n || ny < 1 || ny > m) continue; if(h[nx][ny] >= h[x][y]) continue; if(!v[nx][ny]) dfs(nx,ny); if(l[x][y] > l[nx][ny]) l[x][y] = l[nx][ny]; if(r[x][y] < r[nx][ny]) r[x][y] = r[nx][ny]; } } int main() { cin >> n >> m; memset(l, 0x3f, sizeof(l)); for (int i = 1; i <= m;i++) l[n][i] = r[n][i] = i; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> h[i][j]; for (int i = 1; i <= m; i++) if(!v[1][i]) dfs(1, i); for (int i = 1; i <= m; i++) if(!v[n][i]) {can = 1; ans++;} if (can) {cout << 0 << endl << ans << endl; return 0;} int left = 1; while (left <= m) { int now = 0; for (int i = 1; i <= m; i++) if(l[1][i] <= left) if(now < r[1][i]) now = r[1][i]; left = now + 1; ans++; } cout << 1 << endl << ans << endl; return 0; }


测评信息: