密室逃脱7环游世界古董区花盆谜题。
因为每个人都不一样,没有现成的答案,我又实在试不出来,无奈求助于编程。
没想到有一天不会编程连游戏都玩不了了。。。。。。
c++,改主函数中花盆数字以及行列和,运行就是答案,希望对大家有用~~
#include#include using namespace std; bool isValid(int row, int col, int k, vector & nums, vector & colnum, vector & rownum, vector & used, vector >& board) { bool flag = used[k]; if (used[k]) return false; int m = rownum.size(), n = colnum.size(); for (int i = 0; i < m; i++) { // 判断行里是否符合条件 int nullnum = 0, sum = 0; for (int a : board[i]) { if (a == -1) ++nullnum; else{ sum += a; } } if (sum > rownum[i]) return false; if (sum < rownum[i] && nullnum == 0) return false; } for (int j = 0; j < n; j++) { // 判断列里是否符合条件 int nullnum = 0, sum = 0; for (int a = 0; a < m; ++a) { if (board[a][j] == -1) ++nullnum; else{ sum += board[a][j]; } } if (sum > colnum[j]) return false; if (sum < colnum[j] && nullnum == 0) return false; } return true; } bool backtracking(vector & nums, vector & colnum, vector & rownum, vector & used, vector >& board) { for (int i = 0; i < board.size(); i++) { // 遍历行 for (int j = 0; j < board[0].size(); j++) { // 遍历列 if (board[i][j] != -1) continue; // 填上了 for (int k = 0; k < nums.size(); k++) { // (i, j) 这个位置放k是否合适 board[i][j] = nums[k]; // 放置k if (isValid(i, j, k, nums, colnum, rownum, used, board)) { used[k] = true; if (backtracking(nums, colnum, rownum, used, board)) return true; // 如果找到合适一组立刻返回 used[k] = false; } board[i][j] = -1; // 回溯,撤销k } return false; // 数试完都不行,那么就返回false } } return true; } int main() { vector map = {2, 6, 5, 7, 1, 5, 4, 4, 9, 3, 6, 8}; // 换成你的游戏中所有花盆上的数字 vector colnum = {14, 14, 13, 19}; // 换成你的游戏中每列的和 vector rownum = {20, 14, 26}; // 换成你的游戏中每行的和 vector used(map.size(), false); vector > ans(rownum.size(), vector (colnum.size(), -1)); if (backtracking(map, colnum, rownum, used, ans)) { for (auto a: ans) { for (int k: a) { cout << k << " "; } cout << endl; } } return 0; }



