tamanho n x n • Posições aleatórias com números entre 0…n2-1 • Objetivo: todas as colunas, linhas e submatrizes possuem valores entre 0…n2-1 exatamente uma vez. • Lista de problemas NP-Completos (Kendall et al., 2008)
n = instance.size int values[]; for i = 0 until n-1 do values = new int[n] //Todos os valores de values são zero na criação for j = 0 until n-1 do if (instance[i][j] != BLANK && instance[i][j] != certificate[i][j]) return invalid if (certificate[i][j] == BLANK || values[certificate[i][j]] == 1) return invalid values[certificate[i][j] == 1 endfor endfor
do for j = 0 until n-1, j += subMatrixSize do values = new int[n] for k = 0 until subMatrixSize-1 do for h = 0 until subMatrixSize-1 do if (values[certificate[i + k][j + h]] == 1) return invalid values[certificate[i + k][j + h] == 1 endfor endfor return valido
com números entre 0…n-1 • Objetivo: todas as colunas, linhas possuem valores entre 0…n-1 exatamente uma vez. • Problema provado NP-completo (utilizando redução a partir de 1-in-4-SAT)
8 1 2 7 8 1 2 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 L(k, j/n) * n se i = 0 e h = 0 e L(k, j/n) != Ø S(i+k, j+h) Ø se i = 0 e h = 0 e L(k, j/n) = Ø (((k+i) mod n) * n + [(k+i)/n] + j + h) mod n2 { 0 ≤ k ≤ n; 0 ≤ h < n. Posições em uma submatriz 0 ≤ j < n2 com j variando de n em n. Representa uma coluna de submatrizes 0 ≤ i < n2 com i variando de n em n. Representa uma linha de submatrizes
6 7 8 3 4 5 7 8 1 2 7 8 1 2 3 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 L(k, j/n) * n se i = 0 e h = 0 e L(k, j/n) != Ø S(i+k, j+h) Ø se i = 0 e h = 0 e L(k, j/n) = Ø (((k+i) mod n) * n + [(k+i)/n] + j + h) mod n2 { 0 ≤ k ≤ n; 0 ≤ h < n. Posições em uma submatriz 0 ≤ j < n2 com j variando de n em n. Representa uma coluna de submatrizes 0 ≤ i < n2 com i variando de n em n. Representa uma linha de submatrizes
0 1 2 3 4 5 6 7 8 3 4 5 6 7 8 0 1 2 6 7 8 0 1 2 3 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 L(k, j/n) * n se i = 0 e h = 0 e L(k, j/n) != Ø S(i+k, j+h) Ø se i = 0 e h = 0 e L(k, j/n) = Ø (((k+i) mod n) * n + [(k+i)/n] + j + h) mod n2 { 0 ≤ k ≤ n; 0 ≤ h < n. Posições em uma submatriz 0 ≤ j < n2 com j variando de n em n. Representa uma coluna de submatrizes 0 ≤ i < n2 com i variando de n em n. Representa uma linha de submatrizes Sim para ambos
5 6 7 8 4 5 7 8 1 2 0 7 8 6 1 2 3 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 L(k, j/n) * n se i = 0 e h = 0 e L(k, j/n) != Ø S(i+k, j+h) Ø se i = 0 e h = 0 e L(k, j/n) = Ø (((k+i) mod n) * n + [(k+i)/n] + j + h) mod n2 { 0 ≤ k < n; 0 ≤ h < n. Posições em uma submatriz 0 ≤ j < n2 com j variando de n em n. Representa uma coluna de submatrizes 0 ≤ i < n2 com i variando de n em n. Representa uma linha de submatrizes Não para ambos
sudoku = new int[n * n][n * n] for i = 0 until (n * n)-1; i += n do for j = 0 until (n * n)-1; j += n do for k = 0 until n-1 do for h = 0 until n-1 do if (i == 0 && h == 0) do if (latinSquares[k][j / n] == BLANK) do sudoku[k + i][j + h] = BLANK else do sudoku[k + i][j + h] = (latinSquares[k][j / n]) * n endif else do sudoku[k + i][j + h] = (((k + i) % n) * n + ((k + i) / n) + j + h) % (n*n) endif endfor endfor endfor endfor return sudoku end
and K. Spoerer. A survey of NP-complete puzzles. ICGA Journal,31(1):13–34, 2008 • Takayuki Yato and Takahiro Seta. Complexity and Completeness of Finding Another Solution and Its Application to Puzzles.IEICE Transactions on Fundamentals of Electronics, Communications, and Computer Sciences E86-A:5, 2003