#45998: 解題思路及實作模擬c++


a09387795119@gmail.com (gonnnm)

學校 : 不指定學校
編號 : 157668
來源 : [182.233.24.152]
最後登入時間 :
2025-05-11 09:14:35
f313. 2. 人口遷移 -- 2020年10月APCS | From: [182.233.24.152] | 發表日期 : 2025-05-07 21:25

邏輯釐清https://youtu.be/9oXuWVf2rZ0?si=NRfSWViiriBarQ-S

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

int arr[1000][1000], temp[1000][1000];

int main() {
    int r, c, k, m;
    cin >> r >> c >> k >> m;

    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            cin >> arr[i][j];

    int dx[4] = {0, 1, 0, -1};
    int dy[4] = {1, 0, -1, 0};

    while (m--) {
        for (int i = 0; i < r; i++)
            for (int j = 0; j < c; j++)
                temp[i][j] = arr[i][j];

        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (arr[i][j] < 0) continue;

                int outflow = arr[i][j] / k;
                for (int d = 0; d < 4; d++) {
                    int ni = i + dx[d];
                    int nj = j + dy[d];
                    if (ni >= 0 && ni < r && nj >= 0 && nj < c && arr[ni][nj] >= 0) {
                        temp[i][j] -= outflow;
                        temp[ni][nj] += outflow;
                    }
                }
            }
        }

        for (int i = 0; i < r; i++)
            for (int j = 0; j < c; j++)
                arr[i][j] = temp[i][j];
    }

    int mn = INT_MAX, mx = INT_MIN;
    for (int i = 0; i < r; i++)
        for (int j = 0; j < c; j++)
            if (arr[i][j] >= 0) {
                mn = min(mn, arr[i][j]);
                mx = max(mx, arr[i][j]);
            }

    cout << mn << "\n" << mx;
    return 0;
}

 
ZeroJudge Forum