分享一道算法题
一个3行3列的矩阵(九宫格)
给定6个int,h1,h2,h3,w1,w2,w3,分别代表行总和与列总和,总和范围在[3-30]
试问在9宫格中填写正整数,有多少种填写方式?
class Solution {
public:
void filter() {
// tmp 1, 2, 3, 4
res[0][0] = tmp[0];
res[0][1] = tmp[1];
res[1][0] = tmp[2];
res[1][1] = tmp[3];
res[0][2] = h1 - res[0][0] - res[0][1];
res[1][2] = h2 - res[1][0] - res[1][1];
res[2][0] = w1 - res[0][0] - res[1][0];
res[2][1] = w2 - res[0][1] - res[1][1];
res[2][2] = h3 - res[2][0] - res[2][1];
}
void dfs(int pos) {
if (pos == 4) {
filter();
if (valid()) {
++count_;
}
} else {
for (int i = 1; i <= 28; i++) {
tmp[pos] = i;
dfs(pos + 1);
}
}
}
bool valid() {
for (int i = 0; i < 3; i++) {
for (size_t j = 0; j < 3; j++) {
if (res[i][j] <= 0) return false;
}
}
return res[0][0] + res[0][1] + res[0][2] == h1 &&
res[1][0] + res[1][1] + res[1][2] == h2 &&
res[2][0] + res[2][1] + res[2][2] == h3 &&
res[0][0] + res[1][0] + res[2][0] == w1 &&
res[0][1] + res[1][1] + res[2][1] == w2 &&
res[0][2] + res[1][2] + res[2][2] == w3;
}
int func(const vector<int>& data) {
res.resize(3, vector<int>(3, 0));
tmp.resize(4, 0);
h1 = data[0], h2 = data[1], h3 = data[2];
w1 = data[3], w2 = data[4], w3 = data[5];
dfs(0);
return count_;
}
private:
int count_ = 0;
int h1, h2, h3, w1, w2, w3;
vector<int> tmp;
vector<vector<int>> res;
};

查看9道真题和解析