(SPOJ) 1763 - Sudoku - Solução

import java.io.*;
import java.util.*;

class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        Main processando = new Main();
        processando.processa();
        
        System.exit(0);
    }
    
    static int leitor(BufferedReader br) throws NumberFormatException, IOException {
        int n;
        int resp = 0;
        int sinal = 1;
        
        while (true) {
            n = br.read();
            if (n >= '0' && n <= '9') break;
            if (n == '-') sinal = -1;
            if (n == '+') sinal = 1;
        }
        while (true) {
            resp = resp*10 + n-'0';
            n = br.read();
            if (n < '0' || n > '9') break;
        }
        
        return resp*sinal;
    
    }
    
    int[][] leMatriz(BufferedReader br) throws NumberFormatException, IOException {
        int[][] matriz = new int[9][9];
       
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                matriz[i][j] = leitor(br);
            }
        }
       
        return matriz;
    }
   
    int[] zeraVetor(int[] vetor) {
        for (int i = 0; i < 9; i++) {
            vetor[i] = 0;
        }
       
        return vetor;
    }
   
    boolean verificaVetor(int[] vetor) {
        for (int i = 0; i < 9; i++) {
            if (vetor[i] != 1) {
                return true;
            }
        }
       
        return false;
    }

    void processa() throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int qteMatrizes = leitor(br);
        
        int contador = 0;
        while (qteMatrizes > 0) {
            qteMatrizes--;
            boolean semSolucao = false;
            int[][] matriz = leMatriz(br);
            int[] vetor = new int[9];
           
            for (int i = 0; i < 9; i++) {
                for (int j = 0; j < 9; j++) {
                    int indice = matriz[i][j];
                    vetor[indice-1] = 1;
                }
                semSolucao = verificaVetor(vetor);
                if (semSolucao) {
                    break;
                }
            }
       
            for (int i = 0; i < 9; i++) {
                vetor = zeraVetor(vetor);
                for (int j = 0; j < 9; j++) {
                    int indice = matriz[j][i];
                    vetor[indice-1] = 1;
                }
                semSolucao = verificaVetor(vetor);
                if (semSolucao) {
                    break;
                }
            }
            
            vetor = zeraVetor(vetor);
            int jTmp = 0;
            for (int i = 0; i < 9; i++) {
                for (int j = jTmp; j < jTmp+3; j++) {
                    int indice = matriz[i][j];
                    vetor[indice-1] = 1;
                }
                if (i == 2 || i == 5 || i == 8) {
                    if (i == 2) {
                        jTmp = 3;
                    }
                    else if (i == 5) {
                        jTmp = 6;
                    }
                    semSolucao = verificaVetor(vetor);
                    vetor = zeraVetor(vetor);
                }
                if (semSolucao) {
                    break;
                }
            }
                       
            contador++;
            bw.write("Instancia " + contador);
            if (semSolucao) {
                bw.write("\nNAO\n\n");
            }
            else {
                bw.write("\nSIM\n\n");
            }
        }
        
        bw.flush();
        bw.close();
        
        return;
    }
}

Comments

Popular posts from this blog

(Coderbyte) Dash Insert II - Solução

(Coderbyte) Run Length - Solução

(Coderbyte) Counting Minutes I - Solução