- 题解
请输入你不会的题号
- @ 2025-11-22 15:28:25
反正我会问豆包
20 条评论
-
-
#include #include #include using namespace std;
// 每个位置的分值权重 const int score[9][9] = { {6,6,6,6,6,6,6,6,6}, {6,7,7,7,7,7,7,7,6}, {6,7,8,8,8,8,8,7,6}, {6,7,8,9,9,9,8,7,6}, {6,7,8,9,10,9,8,7,6}, {6,7,8,9,9,9,8,7,6}, {6,7,8,8,8,8,8,7,6}, {6,7,7,7,7,7,7,7,6}, {6,6,6,6,6,6,6,6,6} };
int grid[9][9]; // 数独网格 bool row[9][10] = {false}; // row[i][j]表示第i行是否有数字j bool col[9][10] = {false}; // col[i][j]表示第i列是否有数字j bool block[3][3][10] = {false}; // block[i][j][k]表示第(i,j)九宫格是否有数字k int max_sum = -1; // 最高总分 vector<pair<int, int>> empty_cells; // 空单元格列表
// 计算当前网格的总分 int calculate_sum() { int sum = 0; for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { sum += grid[i][j] * score[i][j]; } } return sum; }
// 回溯填充空格,idx为当前处理的空单元格索引 void backtrack(int idx, int current_sum) { // 所有空格填充完成,更新最高分 if (idx == empty_cells.size()) { if (current_sum > max_sum) { max_sum = current_sum; } return; }
int x = empty_cells[idx].first; int y = empty_cells[idx].second; // 剪枝:如果当前分数 + 剩余空格最大可能分数 <= 已找到的最高分,直接返回 int remaining_max = 0; for (int i = idx; i < empty_cells.size(); ++i) { int nx = empty_cells[i].first; int ny = empty_cells[i].second; remaining_max += 9 * score[nx][ny]; // 剩余空格最大可能值为9 } if (current_sum + remaining_max <= max_sum) { return; } // 尝试填入1-9 for (int num = 9; num >= 1; --num) { // 优先尝试大数,更快找到高分解 if (!row[x][num] && !col[y][num] && !block[x/3][y/3][num]) { // 标记数字已使用 row[x][num] = col[y][num] = block[x/3][y/3][num] = true; grid[x][y] = num; // 递归处理下一个空格 backtrack(idx + 1, current_sum + num * score[x][y]); // 回溯:恢复状态 row[x][num] = col[y][num] = block[x/3][y/3][num] = false; grid[x][y] = 0; } }}
int main() { // 输入数独 for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { cin >> grid[i][j]; int num = grid[i][j]; if (num != 0) { // 标记已使用的数字 row[i][num] = true; col[j][num] = true; block[i/3][j/3][num] = true; } else { // 记录空单元格 empty_cells.emplace_back(i, j); } } }
// 计算初始分数(已填数字的分数) int initial_sum = 0; for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { if (grid[i][j] != 0) { initial_sum += grid[i][j] * score[i][j]; } } } // 回溯求解 backtrack(0, initial_sum); // 输出结果 cout << max_sum << endl; return 0;}
-
- 1