Добрый день! Пытаюсь написать решатель Судоку на C++, но почему-то мое простое переборное решение
работает (как мне кажется) вечно. Помогите, пожалуйста, разобраться, что не так.
Изначально решатель писался для задачи
http://projecteuler.net/problem=96,
но он виснет на первом же из предложенных Судоку.
Код:
#include <cstdio>
#include <memory.h>
using namespace std;
const int size = 9;
const int cell = 3;
const int grids = 1;
char grid[size][size];
void init_grid()
{
char buf[size+2];
scanf("%s", buf);
scanf("%s", buf);
for (int i = 0; i < size; i++)
{
scanf("%s", buf);
for (int j = 0; j < size; j++)
grid[i][j] = buf[j] - '0';
}
}
bool done()
{
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
if (grid[i][j] == 0)
return false;
return true;
}
char used[size+1];
void backtrack()
{
if (done())
{
puts("done");
return;
}
for (int i = 0; i < size; i++)
for (int j = 0; j < size; j++)
if (grid[i][j] == 0)
{
memset(used, 0, sizeof(used));
for (int k = 0; k < size; k++)
{
if (grid[i][k]) used[grid[i][k]] = 1;
if (grid[k][j]) used[grid[k][j]] = 1;
}
int sq_i = i / cell, sq_j = j / cell;
for (int k = sq_i*cell; k < (sq_i+1)*cell; k++)
for (int l = sq_j*cell; l < (sq_j+1)*cell; l++)
if (grid[k][l]) used[grid[k][l]] = 1;
for (char k = 1; k <= size; k++)
if (!used[k])
{
grid[i][j] = k;
used[k] = 1;
backtrack();
}
grid[i][j] = 0;
}
}
int main()
{
freopen("sudoku.txt", "rt", stdin);
init_grid();
backtrack();
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
printf("%d", grid[i][j]);
puts("");
}
return 0;
}