Sudoku Adventures, Part II
Foto de Lucas V.
Por: Lucas V.
02 de Junho de 2014

Sudoku Adventures, Part II

Computação Geral

 

Um pedido de perdão

Peço desculpas por ter ficado tanto tempo sem continuar nossa saga pela resolução do sudoku. Andei muito ocupado.

Uma imagem vale mais do que mil palavras:

In the beginning, there was the IO

Um arquivo sudoku

Vamos começar falando como representaremos um sudoku no computador. Nós vamos usar um arquivo de texto com 9 linhas e 9 colunas, cada uma representando uma das 81 posições de um sudoku.

Há duas possibilidades para cada posição: ser um número de 1 a 9 ou ser um 0. Se ela for 0, nós temos que preencher aquela posião para resolver o jogo. Caso contrário, se o número não for 0, aquela posição é dada e nós não vamos mexer nela.

Por exemplo, neste link, temos um sudoku que eu achei no google. A representação dele no nosso arquivo de texto "sudoku.txt" é a seguinte:

4 0 6 0 0 9 8 0 3
0 2 0 0 0 6 0 0 5
9 0 5 0 1 0 0 0 0
0 7 1 0 3 5 0 0 0
2 9 0 0 0 0 0 1 8
0 0 0 1 9 0 6 3 0
0 0 0 0 5 0 9 0 2
8 0 0 4 0 0 0 5 0
1 0 2 9 0 0 4 0 6

Bem simples, certo? Eu só coloquei zeros nos lugares vazios!

Guardando um sudoku no nosso programa

Um sudoku é, se você lembra da escola, uma matriz! Matriz é um nome chique para tabela (OK, uma matriz é mais que uma tabela, mas para nós é uma tabela). Logo, nós só precisamos fazer uma matriz, err, tabela.

Em C++, é muito simples fazer uma tabela que guarda números:

int tabela[lin][col];

Isso faz a variável sudoku ser uma tabela com "lin" linhas e "col" colunas. Um sudoku clássico sempre tem 9 linhas e 9 colunas, logo:

int sudoku[9][9];

Fácil, certo? Então, vamos ao que interessa!

Lendo um arquivo txt com um sudoku

Ler um arquivo em C++ é fácil. Não acho que os detalhes sejam relevantes para resolver o sudoku, então só vou colocar o pedaço do programa que faz isso aqui:

1
2
3
4
5
6
7
8
void ler_sudoku(int sudoku[][9], char nome[128]) {
    ifstream arquivo(nome, ifstream::in);
    for (unsigned i = 0; i < 9; i++) {
        for (unsigned j = 0; j < 9; j++) {
            arquivo >> sudoku[i][j];
        }
    }
}

Essa função vai ler na matriz sudoku o jogo representado no arquivo chamado nome. Agora já sabemos ler um sudoku!

Mas calma, seria bom também conserguirmos ver nosso sudoku resolvido depois de todo esse esforço!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void imprimir_sudoku(int sudoku[][9]) {
    for (unsigned i = 0; i < 9; i++) {
        if (i % 3 == 0) {
            for (unsigned j = 0; j < 9; j++) {
                cout << "===";
            }
            cout << endl;
        }
        for (unsigned j = 0; j < 9; j++) {
            if (j == 0) {
                cout << "| ";
            }
            if (j > 0 && j % 3 == 0) {
                cout << " | ";
            }
            cout << sudoku[i][j] << ' ';
            if (j == 8) {
                cout << "|\n";
            }
        }
    }
    for (unsigned i = 0; i < 9; ++i) {
        cout << "===";
    }
    cout << endl;
}

As duas funções fazem basicamente a mesma coisa: elas andam por cada elemento da tabela da seguinte forma: para cada linha, nós olhamos todas as colunas. Se for a função de ler, nós lemos os elementos na tabela. Se for a de imprimir, nós imprimimos o elemento. O único detalhe é que a função de imprimir tem os detalhes para a impressão ficar bonitinha. :)

Por enquanto é só

Como eu disse, ando muito ocupado, então por hoje é só.

Da próxima vez, nós vamos terminar, pelo menos!

Por enquanto, você pode copiar e colar o código que lê e imprime e brincar com ele! O código está aqui.

Até!

Confira artigos similares

Aprenda sobre qualquer assunto