#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
).