Rompecabezas de Sudoku mínimamente inconsistente

Un sudoku es un rompecabezas parcialmente lleno 9 × 9 cuadrícula con números 1 , , 9 tal que cada columna, cada fila y cada una de las nueve subcuadrículas de 3×3 que componen la cuadrícula no contienen dos del mismo número.

¿Cuál es el número mínimo de entradas necesarias para producir un acertijo inconsistente , es decir, un acertijo que no se puede completar a uno donde hay una solución?

EDITAR: ahora que hay un ejemplo en el que se alcanza 5, ¿se puede mostrar que esto es lo mínimo posible, es decir, que cualquier rompecabezas no trivial con 4 entradas se puede completar hasta una solución?

¿Presumiblemente te refieres a uno que ya no viola trivialmente las restricciones de fila, columna y cuadro?
2 (Editar: Ah, @MGwynne se me adelantó).
Definí un sudoku como un arreglo en el que no se violan estas restricciones. Entonces 2 no es la respuesta.

Respuestas (2)

5?

123|   |   
   |4  |  
___|___|4__
   |   |   
   |   |   
___|___|___
   |   |   
   |   |   
   |   |   
5 probablemente sea el mínimo. Si las cuatro entradas iniciales dadas son algo más que dos pares repetidos, al volver a numerar, intercambiar "bandas" e intercambiar filas/columnas dentro de la misma banda, podemos encontrar una solución de la forma [123456789,456789123,789123456,234567891,. ..]. Si los cuatro números dados están todos contenidos en la misma banda, podemos completar trivialmente la banda y un procedimiento estándar puede convertir la banda completa (sin más restricciones) en un cuadrado completo. El resto no estoy seguro de cómo hacer un procedimiento estándar.
En cuanto a los dos pares repetidos, creo que en realidad puedes poner 9 1 y 2 2 en cualquier lugar legal y el rompecabezas aún se puede resolver. Sin embargo, no puedo probarlo, ¡incluso para 2 2!

Dudo que haya una explicación fácil de leer de la no incompletabilidad del sudoku parcial con un máximo de 4 celdas no vacías. Intenté formar una prueba del caso de 3 celdas no vacías (que es mucho más fácil), y ya se dividió en una gran cantidad de casos. Entonces, opté por una solución computacional. Mi código C ++ está debajo (es un algoritmo de retroceso simple).

Dado que tenemos exactamente 4 símbolos, la distribución de símbolos en bandas es {2,1,1}, {2,2,0}, {3,1,0} o {4,0,0}. Así, podemos suponer:

  • Las dos últimas filas están vacías,
  • Existe otra celda no vacía en las primeras cuatro filas,
  • La celda superior izquierda contiene 1.

Si esto no ocurre en un ejemplo particular, puede permutar las filas/columnas/símbolos para que así sea, conservando las propiedades de sukoku. Luego completamos este caso, luego invertimos la permutación en el sudoku completo para obtener una finalización del ejemplo particular en cuestión. Hay condiciones más estrictas que podríamos suponer que reducirían el espacio de búsqueda (pero no eran necesarias).

El código no encontró ejemplos en los que un sudoku parcial con 4 celdas no vacías fuera incompleto: en todos los casos, se construyó un completo.

#include <stdio.h>
#include <stdlib.h>

int predetermined_cells[9][9];
int test_matrix[9][9];

void print_current_matrix() {
  for(int i=0;i<9;i++) {
    for(int j=0;j<9;j++) {
      printf("%d ",test_matrix[i][j]);
    }
    printf("\n");
  }
  printf("\n");
}

/* checks for clashes of the entry test_matrix[i][j] */
int check_for_clashes(int i, int j) {
  for(int k=0;k<9;k++) {
   if(k!=i && test_matrix[k][j]==test_matrix[i][j]) { return 1; }
     /* same symbols in same column */
   if(k!=j && test_matrix[i][k]==test_matrix[i][j]) { return 1; }
     /* same symbols in same row */
  }

  int p=i/3,q=j/3;
  p=3*p;
  q=3*q;
  for(int k=0;k<3;k++) { for(int l=0;l<3;l++) {
    if(p+k!=i || q+l!=j) {
      if(test_matrix[p+k][q+l]==test_matrix[i][j]) { return 1; } /* block clashes */
    }
  } }

  return 0;
}

int recursion(int pos) {
  if(pos==81) {
    //print_current_matrix();
    return 1;
  }

  int i=pos/9,j=pos%9;
  if(predetermined_cells[i][j]!=0) {
    return recursion(pos+1);
  }
  else {
    for(int k=1;k<=9;k++) {
      test_matrix[i][j]=k;
      if(!check_for_clashes(i,j)) {
        if(recursion(pos+1)) { return 1; }
      }
    }
  }
  test_matrix[i][j]=0;
  return 0;
}

void update_predetermined_cells() {
  for(int i=0;i<9;i++) {
    for(int j=0;j<9;j++) {
      test_matrix[i][j]=predetermined_cells[i][j];
    }
  }
}


void main() {
  predetermined_cells[0][0]=1;

  for(int posA=1;posA<36;posA++) {
    printf("%d out of 35\n",posA);
    for(int posB=posA+1;posB<63;posB++) {
      for(int posC=posB+1;posC<63;posC++) {
        for(int symA=1;symA<=9;symA++) {
          for(int symB=1;symB<=9;symB++) {
            for(int symC=1;symC<=9;symC++) {
              int rowA=posA/9,colA=posA%9,rowB=posB/9,colB=posB%9,rowC=posC/9,colC=posC%9;
              predetermined_cells[rowA][colA]=symA;
              predetermined_cells[rowB][colB]=symB;
              predetermined_cells[rowC][colC]=symC;
              update_predetermined_cells();
              if(!check_for_clashes(rowA,colA) && !check_for_clashes(rowB,colB) && !check_for_clashes(rowC,colC)) {
                if(!recursion(0)) {
                  printf("[%d,%d,%d], [%d,%d,%d], [%d,%d,%d] %d\n",rowA,colA,symA,rowB,colB,symB,rowC,colC,symC);
                }
              }
              predetermined_cells[rowA][colA]=0;
              predetermined_cells[rowB][colB]=0;
              predetermined_cells[rowC][colC]=0;
            }
          }
        }
      }
    }
  }
}

Este problema se relaciona con la conjetura de Evans en cuadrados latinos, que establece que cualquier norte × norte cuadrado latino parcial, formado por norte 1 las celdas llenas que no chocan, se pueden completar en un cuadrado latino. Este resultado fue probado posteriormente por:

B. Smetaniuk, Una nueva construcción sobre cuadrados latinos. I. Una prueba de la conjetura de Evans. Ars Combinatoria (11) 1981, pp. 155-172.