
密室逃脱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;
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)