小美的平衡矩阵

39 阅读1分钟

小美的平衡矩阵

小美拿到了一个n∗n的矩阵,其中每个元素是 0 或者 1。
小美认为一个矩形区域是完美的,当且仅当该区域内 0 的数量恰好等于 1 的数量。
现在,小美希望你回答有多少个i∗i的完美矩形区域。你需要回答1≤i≤n的所有答案。\

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    let params = [];
    while ((line = await readline())) {
        let tokens = line.split(" ");
        // let a = parseInt(tokens[0]);
        // let b = parseInt(tokens[1]);
        // console.log(a + b);
        params.push(tokens);
    }
    // console.log(params)
    let n = parseInt(params[0]);
    // console.log(n)
    // 对于每个i*i 的矩阵,遍历所有可能的情况,对于1*1的矩阵来说,输出是0
    let matric = [];
    let count = 0;
    console.log(0);
    for (let i = 0; i < n; i++) {
        matric[i] = params[i + 1][0].split("").map(Number);
    }
    // 用矩阵前缀和优化
    // 用preSum[i][j] 表示 matric[i-1][j-1] 的矩阵和
    let preSum = new Array(n + 1).fill(null).map((v) => Array(n + 1).fill(0));
    // console.log(preSum)
    for (let i = 1; i <= n; i++) {
        for (let j = 1; j <= n; j++) {
            preSum[i][j] =
                matric[i - 1][j - 1] +
                preSum[i - 1][j] +
                preSum[i][j - 1] -
                preSum[i - 1][j - 1];
        }
    }
    function getPrefixSum(r1, c1, r2, c2) {
        return (
            preSum[r2 + 1][c2 + 1] -
            preSum[r1][c2 + 1] -
            preSum[r2 + 1][c1] +
            preSum[r1][c1]
        );
    }
    // console.log(params)
    for (let i = 2; i <= n; i++) {
        // 对行,对列进行依次的扫描
        if ((i * i) % 2 != 0) {
            // console.log(i*i)
            console.log(0);
            continue;
        }
        let target = (i * i) / 2; // 总值
        count = 0;
        for (let j = 0; j <= n - i; j++) {
            for (let k = 0; k <= n - i; k++) {
                if (target === getPrefixSum(j, k, j + i - 1, k + i - 1)) {
                    count++;
                }
            }
        }
        console.log(count);
    }
})();