function res = resolve(m)
  res = m;
  do
    emfalta = length(res(res == 0));
    # printf('Faltam %d casas\n', emfalta);
    res = percorre(res);
    sofaltam = length(res(res == 0));
    # printf('Faltam %d casas\n', sofaltam);
  until (sofaltam == 0 | emfalta == sofaltam);
  if (emfalta == sofaltam)
    printf('Desisto! Demasiado complicado para mim.\n');
  endif
endfunction

function res = percorre (m)
  preenchidos = 0;
  res = m;
  for linha = 1:9,
    for coluna = 1:9,
      if (m(linha, coluna) == 0)
        % por preencher
        valor = calculaPossiveis(res, linha, coluna);
        if (valor > 0)
          res(linha, coluna) = valor;
        endif
      endif
    endfor
  endfor
endfunction

function numero = calculaPossiveis(tabuleiro, linha, coluna)
  faltanalinha = setdiff(1:9, tabuleiro(linha,:));
  faltanacoluna = setdiff(1:9, tabuleiro(:,coluna));
  faltanamatriz = setdiff(1:9, submatriz(tabuleiro, linha, coluna));
  falta = intersect(intersect(faltanalinha, faltanacoluna),faltanamatriz);
  if length(falta) == 1
    numero = falta(1);
  else
    numero = 0;
  endif
endfunction

function res = submatriz(m, linha, coluna)
  x = fix((linha-1)/3)*3+1;
  y = fix((coluna-1)/3)*3+1;
  res = m([x:x+2], [y:y+2]);
endfunction