分享一道算法题

一个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;
};

全部评论

相关推荐

01-26 22:20
已编辑
门头沟学院 Java
Java抽象带篮子:项目很nb了,现在好好准备八股和算法吧,早点找实习,可以看看我的置顶帖子。帖子里写了怎么改简历,怎么包装实习经历,还有2个高质量可速成的项目话术,和我的牛客八股笔记专栏
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务