Решатель судоку генерирует ячейки со значением 50

#c

#c

Вопрос:

Я написал код для решения головоломки судоку, но я не получаю ожидаемого результата. мои цифры должны быть от 1 до 9, но в моем выводе он также получает 50 . Я помещаю свои значения символов в вектор, и я думаю, что может возникнуть проблема. я запускаю программу через отладчик, и ошибок нет.

мой код:

 #include<string>
#include<list>
#include<iostream>
#include<vector>

using namespace std;

#define N 9 



vector<char> getCandidates(int grid[N][N], int row, int col){

vector<char> resu<

for (char c = '1'; c <= '9'; c  )
{
    
            bool collision = false;

            for (int i = 0; i < 9; i  )
            {
                if (grid[row][i] == c ||
                    grid[i][col] == c ||
                    grid[(row - row % 3)   i / 3][(col - col % 3)   i % 3] == c)
                {
                    collision = true;
                    break;
                }
            }

            if (!collision)
                result.emplace_back(c);
                 

         }

         return resu<
    
}

bool Solve(int grid[N][N])
{

    bool solved = false;

    int row = -1;
    int col = -1;
    vector<char> candidates;
    candidates.clear();

    for (int i = 0; i < 9; i  )
        for (int j = 0; j < 9; j  )
            if (grid[i][j] == 0)
            {
                vector<char> newCandidates = getCandidates(grid, i, j);
                if (row < 0 || newCandidates.size() < candidates.size())
                {
                    row = i;
                    col = j;
                    candidates = newCandidates;
                }
            }

    if (row < 0)
    {
        solved = true;
    }
    else
    {

        for (int i = 0; i < candidates.size(); i  )
        {
            grid[row][col] = candidates[i];
           
            if (Solve(grid))
            {
                solved = true;
                break;
            }
            grid[row][col] = 0;
        }
    }

    return solved;

}




void printGrid(int grid[N][N])
{
    for (int row = 0; row < N; row  ) {
        for (int col = 0; col < N; col  )
            cout << grid[row][col] << " ";
        cout << endl;
    }
}


int main()
{

    int grid[N][N] = { { 3, 0, 6, 5, 0, 8, 4, 0, 0 },
                       { 5, 2, 0, 0, 0, 0, 0, 0, 0 },
                       { 0, 8, 7, 0, 0, 0, 0, 3, 1 },
                       { 0, 0, 3, 0, 1, 0, 0, 8, 0 },
                       { 9, 0, 0, 8, 6, 3, 0, 0, 5 },
                       { 0, 5, 0, 0, 9, 0, 6, 0, 0 },
                       { 1, 3, 0, 0, 0, 0, 2, 5, 0 },
                       { 0, 0, 0, 0, 0, 0, 0, 7, 4 },
                       { 0, 0, 5, 2, 0, 6, 3, 0, 0 } };


    if (Solve(grid) == true)
        printGrid(grid);
    else
        cout << "No solution exists";

    return 0;
}
  

Вывод, который я получаю:

 3 49 6 5 50 8 4 51 52
5 2 51 52 54 55 49 50 53
50 8 7 49 51 53 54 3 1
52 51 3 50 1 49 53 8 54
9 54 50 8 6 3 51 49 5
53 5 49 51 9 52 6 55 50
1 3 52 54 49 50 2 5 51
49 53 54 55 52 51 50 7 4
51 50 5 2 53 6 3 52 49
  

Комментарии:

1. '1' и 1 это две разные вещи.

2. Совет: не используйте #define в C , используйте const . Вам также не нужно if (x == true) , вы можете просто if (x)

Ответ №1:

Этот цикл:

 for (char c = '1'; c <= '9'; c  )
  

на самом деле выполняется итерация от 49 до 57 (при условии кодировки ASCII), тогда как grid содержит int значения от 1 до 9.

Просто измените цикл на:

 for (int c = 1; c <= 9; c  )
  

Комментарии:

1. @user4581301 Отредактирован, чтобы упомянуть, что это ASCII. Но все же, вы, вероятно, правы, я сомневаюсь, что кого-то волнует EBCDIC 😉

Ответ №2:

Ну, вы путаете символы и их числовой код.

Взгляните на таблицу ASCII (она также действительна для других кодировок символов, таких как ISO-8859-1 и UTF-8, по крайней мере, от ‘1’ до ‘9):

  • ‘1’ соответствует значению 49
  • ‘2’ соответствует значению 50
  • ‘9’ соответствует значению 57

Теперь вам нужно решить, хотите ли вы:

  • сетка должна иметь значения от 1 до 9, в этом случае вы используете for (int c = 1; c <= 9; c ) , — но вам нужно будет добавить префикс при печати, то есть что-то вроде (char) ('0' grid[col][row]) , или
  • сетка должна содержать символы от ‘1’ до ‘9’, и в этом случае вы используете for (int c = '1'; c <= '9'; c ) , и можете просто распечатать ее как есть (хотя все еще применяете к char ).