Добрый день! Пытаюсь написать решатель Судоку на 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;
}