密室逃脱7环游世界古董区花盆谜题

密室逃脱7环游世界古董区花盆谜题,第1张

密室逃脱7环游世界古董区花盆谜题。
因为每个人都不一样,没有现成的答案,我又实在试不出来,无奈求助于编程。
没想到有一天不会编程连游戏都玩不了了。。。。。。
c++,改主函数中花盆数字以及行列和,运行就是答案,希望对大家有用~~

#include 
#include 
using namespace std;


bool isValid(int row, int col, int k, vector<int>& nums, vector<int>& colnum, 
            vector<int>& rownum, vector<bool>& used, vector<vector<int>>& 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<int>& nums, vector<int>& colnum, vector<int>& rownum, 
                vector<bool>& used, vector<vector<int>>& 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<int> map = {2, 6, 5, 7, 1, 5, 4, 4, 9, 3, 6, 8}; // 换成你的游戏中所有花盆上的数字
    vector<int> colnum = {14, 14, 13, 19};                  // 换成你的游戏中每列的和
    vector<int> rownum = {20, 14, 26};                      // 换成你的游戏中每行的和
    vector<bool> used(map.size(), false);
    vector<vector<int>> ans(rownum.size(), vector<int>(colnum.size(), -1));
    if (backtracking(map, colnum, rownum, used, ans)) {
        for (auto a: ans) {
            for (int k: a) {
                cout << k << " ";
            }
            cout << endl;
        }
    }
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1353604.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-14
下一篇2022-06-14

发表评论

登录后才能评论

评论列表(0条)

    保存