数独生成器中的 C++ 运行时检查失败 #2 错误

问题描述 投票:0回答:1

我编写了一个具有用于创建数独表的循环的代码 在每个问题循环再次开始并导致如此多的尝试之后 它工作正常,但最后我得到了一个错误

int TableGenerator() {
    int Table[9][9] = {
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
    };

    srand(time(nullptr));
    list<int> AvailableNumbers;

    int ySquare;
    int xSquare;

    int y = 0;
    int x;

    while (y < 9) {
        AvailableNumbers = { 1,2,3,4,5,6,7,8,9 };
        x = 0;
        while (x < 9) {
            list<int> ColumnAvailableNumbers = AvailableNumbers;
            ySquare = y - (y % 3);
            xSquare = x - (x % 3);
            for (int yCoSquare = ySquare; yCoSquare < ySquare + 3; yCoSquare++) {
                for (int xCoSquare = xSquare; xCoSquare < xSquare + 3; xCoSquare++) {
                    ColumnAvailableNumbers.remove(Table[yCoSquare][xCoSquare]);
                }
            }
            for (int Checker = 0; Checker < y; Checker++) {
                ColumnAvailableNumbers.remove(Table[Checker][x]);
            }

            if (ColumnAvailableNumbers.size() > 0) {
                auto it = next(ColumnAvailableNumbers.begin(), rand() % ColumnAvailableNumbers.size());
                Table[y][x] = *it;
                AvailableNumbers.remove(*it);
            }
            else {
                for (int yClear = 0; yClear < 9; yClear++) {
                    for (int xClear = 0; xClear < 9; xClear++) {
                        Table[yClear][xClear] = 0;
                    }
                }
                y = -1;
            }

            x++;
        }
        y++;
    }

    for (int y = 0; y < 9; y++) {
        for (int x = 0; x < 9; x++) {
            std::cout << Table[y][x];
        }
        cout << endl;
    }
    return 0;
}

这是错误:

调试错误! 程序: E:\Sudoku.exe 模块:E:\Sudoku.exe 文件:

运行时检查失败 #2 - 变量“表”周围的堆栈已损坏。

(按“重试”来调试应用程序)

c++ loops sudoku
1个回答
0
投票

既然您设置了

y = -1;
,那么
Table[y][x] = *it;
将在下一次迭代中具有未定义的行为。

如果您想结束两个循环,您可以将其设置为

9
break
在内循环之外。

y = 9;
break;
© www.soinside.com 2019 - 2024. All rights reserved.