You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

16x16数独求解器逻辑错误排查求助(附C++代码)

16x16数独求解器逻辑错误排查求助

正在开发16x16数独求解器,此前完成的9x9版本运行良好。采用消元+猜测的策略,但当前C++代码存在逻辑错误,无法得到正确结果。作为编程入门学生,希望得到易懂的帮助。以下是代码、测试输入及输出:

#include <iostream>
#include <vector>
#include <array>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <set>

using namespace std;

const int N = 16;
array<array<int, N>, N> board;
array<array<set<int>, N>, N> possibilities;
vector<pair<int, int>> guesses;

void eliminate_possibilities();

int char_to_int(char c) {
    if (c >= '0' && c <= '9') {
        return c - '0';
    } else if (c >= 'A' && c <= 'F') {
        return c - 'A' + 10;
    } else {
        return 0;
    }
}

char int_to_char(int i) {
    if (i >= 0 && i <= 9) {
        return '0' + i;
    } else if (i >= 10 && i <= 15) {
        return 'A' + i - 10;
    } else {
        return '0';
    }
}

bool solve() {
    int min_possibilities = N + 1;
    pair<int, int> next_cell = {-1, -1};
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (board[i][j] != 0) {
                continue;
            }
            if (possibilities[i][j].size() < min_possibilities) {
                min_possibilities = possibilities[i][j].size();
                next_cell = {i, j};
            }
        }
    }
    if (next_cell.first == -1 && next_cell.second == -1) {
        return true;
    }
    int row = next_cell.first;
    int col = next_cell.second;
    for (int val : possibilities[row][col]) {
        board[row][col] = val;
        guesses.emplace_back(row, col);
        eliminate_possibilities();
        if (solve()) {
            return true;
        }
        board[row][col] = 0;
        guesses.pop_back();
    }
    return false;
}

void eliminate_possibilities() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            if (board[i][j] != 0) {
                continue;
            }
            set<int> &p = possibilities[i][j];
            p.clear();
            for (int val = 1; val <= N; val++) {
                bool valid = true;
                for (int k = 0; k < N; k++) {
                    if (board[i][k] == val || board[k][j] == val) {
                        valid = false;
                        break;
                    }
                }
                int boxRowStart = (i / 4) * 4;
                int boxColStart = (j / 4) * 4;
                for (int r = boxRowStart; r < boxRowStart + 4; r++) {
                    for (int c = boxColStart; c < boxColStart + 4; c++) {
                        if (board[r][c] == val) {
                            valid = false;
                            break;
                        }
                    }
                }
                if (valid) {
                    p.insert(val);
                }
            }
        }
    }
}

void print_board() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout << int_to_char(board[i][j]) << " ";
        }
        cout << endl;
    }
}

int main() {
    srand(time(0));
    char c;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cin >> c;
            board[i][j] = char_to_int(c);
        }
    }

    eliminate_possibilities();
    if (!solve()) {
        cout << "No Solution" << endl;
    } else {
        print_board();
    }

    return 0;
}

测试输入与输出

测试用例1

输入
C 0 8 9 0 6 F 0 4 0 0 B E 0 D 1
0 0 5 0 0 8 0 0 0 D 0 G B 0 0 3
B 0 0 0 0 0 0 0 0 0 0 5 4 8 0 0
0 0 6 0 0 0 A G 0 0 0 0 0 0 0 9
0 5 0 0 C 9 0 0 0 F 0 8 A 4 0 0
0 0 F 4 8 D 0 0 0 0 G E C 0 0 5
A G 0 8 0 0 6 E 0 4 0 0 0 0 9 0
6 0 0 E 0 G 4 0 3 5 B 9 D 0 1 0
0 9 0 0 0 0 0 0 C 0 0 0 0 1 E 6
0 0 E 0 0 0 0 0 0 9 0 0 G 0 F 0
0 0 B 0 A 0 G 0 0 7 8 0 0 0 C D
0 0 0 D 0 B C 0 0 0 0 F 8 3 5 0
8 B 0 A 0 C 2 0 0 0 6 0 0 7 4 0
E 0 D F G 0 8 0 B 0 0 0 0 9 0 0
0 0 0 0 F 0 B 0 0 E 0 0 6 0 0 0
0 7 4 6 1 A D 0 0 C 0 0 F 0 0 0
预期输出
C A 8 9 2 6 F 5 4 3 7 B E G D 1
1 F 5 2 4 8 E 7 9 D A G B C 6 3
B E G 7 D 3 9 C 1 6 2 5 4 8 A F
4 D 6 3 B 1 A G E 8 F C 2 5 7 9
D 5 7 B C 9 3 2 6 F 1 8 A 4 G E
9 3 F 4 8 D 1 B 7 A G E C 6 2 5
A G 1 8 5 F 6 E D 4 C 2 3 B 9 7
6 2 C E 7 G 4 A 3 5 B 9 D F 1 8
F 9 A G 3 2 5 8 C B D 4 7 1 E 6
5 8 E C 6 4 7 D 2 9 3 1 G A F B
3 4 B 1 A E G F 5 7 8 6 9 2 C D
7 6 2 D 9 B C 1 A G E F 8 3 5 4
8 B 9 A E C 2 3 F 1 6 D 5 7 4 G
E C D F G 5 8 6 B 2 4 7 1 9 3 A
2 1 3 5 F 7 B 4 G E 9 A 6 D 8 C
G 7 4 6 1 A D 9 8 C 5 3 F E B 2
实际输出
C A 8 9 2 6 F 5 4 3 7 B E 0 D 1
1 F 5 2 4 8 E 7 9 D A 0 B C 6 3
B E 0 7 D 3 9 C 1 6 2 5 4 8 A F
4 D 6 3 B 1 A 0 E 8 F C 2 5 7 9
D 5 7 B C 9 3 2 6 F 1 8 A 4 0 E
9 3 F 4 8 D 1 B 7 A 0 E C 6 2 5
A 0 1 8 5 F 6 E D 4 C 2 3 B 9 7
6 2 C E 7 0 4 A 3 5 B 9 D F 1 8
F 9 A 0 3 2 5 8 C B D 4 7 1 E 6
5 8 E C 6 4 7 D 2 9 3 1 0 A F B
3 4 B 1 A E 0 F 5 7 8 6 9 2 C D
7 6 2 D 9 B C 1 A 0 E F 8 3 5 4
8 B 9 A E C 2 3 F 1 6 D 5 7 4 0
E C D F 0 5 8 6 B 2 4 7 1 9 3 A
2 1 3 5 F 7 B 4 0 E 9 A 6 D 8 C
0 7 4 6 1 A D 9 8 C 5 3 F E B 2

测试用例2

输入
0 0 0 0 7 0 0 0 0 0 0 0 0 E 0 2
7 0 B 0 0 0 0 0 A 0 2 D 0 F 0 5
1 0 G E 3 B 2 0 5 0 0 0 0 0 0 D
0 2 0 5 0 0 0 0 0 0 7 0 0 8 B 0
2 0 0 0 0 0 G 0 0 6 0 0 0 0 0 0
0 B 1 C E 0 0 0 8 0 5 7 0 A 0 0
F 0 0 G 0 0 0 0 1 0 9 2 0 0 6 4
0 0 5 0 2 0 0 7 0 0 0 4 8 1 0 B
0 0 4 0 0 0 0 8 0 A 0 B C 0 0 1
0 0 8 6 0 E 0 3 D 0 0 0 0 9 0 0
0 0 D F B G 5 4 0 0 3 0 0 0 0 A
0 G 0 9 C 0 0 0 0 0 0 6 B 0 8 0
0 0 0 D 6 0 0 0 0 1 F G 0 0 7 0
E 0 0 A 0 C B 0 9 0 0 0 0 5 0 0
0 0 3 0 5 0 0 0 0 B 0 0 D 0 E 0
0 0 0 0 0 1 0 G 3 E C 0 A 0 0 0
预期输出
D A F 8 7 9 4 5 B C 6 1 G E 3 2
7 9 B 4 G 8 E C A 3 2 D 6 F 1 5
1 C G E 3 B 2 6 5 9 8 F 7 4 A D
3 2 6 5 F A D 1 G 4 7 E 9 8 B C
2 8 9 7 1 4 G A C 6 B 3 F D 5 E
4 B 1 C E 6 3 D 8 F 5 7 2 A 9 G
F E A G 8 5 C B 1 D 9 2 3 7 6 4
6 D 5 3 2 F 9 7 E G A 4 8 1 C B
5 3 4 2 9 7 6 8 F A E B C G D 1
B 7 8 6 A E 1 3 D 2 G C 5 9 4 F
C 1 D F B G 5 4 7 8 3 9 E 6 2 A
A G E 9 C D F 2 4 5 1 6 B 3 8 7
8 5 C D 6 3 A E 2 1 F G 4 B 7 9
E 6 2 A 4 C B F 9 7 D 8 1 5 G 3
G F 3 1 5 2 7 9 6 B 4 A D C E 8
9 4 7 B D 1 8 G 3 E C 5 A 2 F 6
实际输出
"No Solution"

猜测问题可能出在猜值选择或终止条件上,期待回复,谢谢!

内容的提问来源于stack exchange,提问作者Joash Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:16:13