栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

密室逃脱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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960438.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号