小美的平衡矩阵
小美拿到了一个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);
}
})();