PI 2018-Q1 - Correção Simulado 2

Clique aqui para baixar o enunciado do simulado.

Clique aqui para baixar o arquivo .java diretamente.

import java.util.Random;
import java.util.Scanner;

public class Simulado2 {

    public static void questao1() {
        Scanner scanner = new Scanner(System.in);

        int s = scanner.nextInt();
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        int[][] matriz = new int[n][m];
        //Lê a matriz
        for (int i = 0; i < n; i++) {
            for  (int j = 0; j < m; j++) {
                matriz[i][j] = scanner.nextInt();
            }
        }
        //Compara a soma elementos à esquerda e acima para cada um dos elementos
        // da matriz.
        for (int i = 0; i < n; i++) {
            for  (int j = 0; j < m; j++) {
                /* O fato de ambos os ifs verificarem se i,j >0 para fazerem algo
                 * nos faz pensar que os laços poderiam começar de 1 e não de 0.
                 * Mas isso não funcionaria. Por que?
                 */
                if (i > 0 && matriz[i - 1][j] + matriz[i][j] == s) {
                    System.out.printf("(%d,%d)-(%d,%d) ", i - 1, j, i, j);
                }
                if (j > 0 && matriz[i][j-1] + matriz[i][j] == s) {
                    System.out.printf("(%d,%d)-(%d,%d) ", i, j - 1, i, j);
                }
            }
        }
        System.out.println();
    }

    public static int[] entremeia (int[] v1, int[] v2) {
        // Entremeia (mais comumente conhecido como intercala) dois vetores
        // ordenados.

        // Vetor que contém o resultado a ser devolvido
        int[] v3 = new int[v1.length + v2.length];
        // Índices do próximo elemento de v1, e v2
        int p_v1 = 0;
        int p_v2 = 0;
        int p_v3 = 0;

        while (p_v1 < v1.length && p_v2 < v2.length) {
            v3[p_v3++] = v1[p_v1] < v2[p_v2] ? v1[p_v1++] : v2[p_v2++];
        }

        // Copia os elementos remanescentes. Note que apenas um dos vetores terá
        // elementos sobrando. Pq?
        while (p_v1 < v1.length) {
            v3[p_v3++] = v1[p_v1++];
        }
        while (p_v2 < v2.length) {
            v3[p_v3++] = v2[p_v2++];
        }

        return v3;
    }

    public static void questao2() {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int[] v1 = new int[n];
        //Lê o 1 vetor
        for (int i = 0; i < n; i++) {
            v1[i] = scanner.nextInt();
        }

        int m = scanner.nextInt();
        int[] v2 = new int[m];
        //Lê o 2 vetor
        for (int i = 0; i < m; i++) {
            v2[i] = scanner.nextInt();
        }

        int[] v3 = entremeia(v1, v2);
        for (int i = 0; i < v3.length; i++) {
            System.out.print(v3[i] +  " ");
        }
        System.out.println();
    }

    public static void questao3() {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int[] v = new int[n];
        //Lê o vetor
        for (int i = 0; i < n; i++) {
            v[i] = scanner.nextInt();
        }

        //Ordena os elementos do vetor. Este algoritmo é chamado de BubbleSort
        for (int i = 0; i < n - 1; i++) { //Efetua as n - 1 varreduras
            /* A cada varredura precisamos varrer um elemento a menos. Para isso
             * aproveitamos o contador do laço externo (i) que já está efetuando
             * a contagem
             */
            for (int j = 1; j < n - i; j++) {
                if (v[j - 1] > v[j]) { //Caso a ordem esteja invertida, troca
                    int tmp = v[j - 1];
                    v[j - 1] = v[j];
                    v[j] = tmp;
                }
            }
        }

        //imprime o elementos do vetor já ordenado
        for (int i = 0; i < n; i++) {
            System.out.print(v[i] +  " ");
        }
        System.out.println();

    }

    public static void questao4() {
        Random rand = new Random();
        int nJogadas = 15;
        //Armazena a quantidade de números não repetidos já sorteados
        int qtd = 0;
        //Armazena os números já sorteados, sem repetições
        int[] sorteados = new int[nJogadas];

        while (qtd < nJogadas) {
            // Sorteia um número no intervalo desejado.
            // Usar nextInt(26) diretamente (sem o +1) não funciona. Pq?
            int candidato = rand.nextInt(25) + 1;
            //verifica se é um número repetido
            boolean repetido = false;
            for (int i = 0; i < qtd && !repetido; i++) {
                repetido = sorteados[i] == candidato;
            }
            if (!repetido) {
                sorteados[qtd++] = candidato;
            }
        }

        //Imprime os números sorteados
        for (int i = 0; i < nJogadas; i++) {
            System.out.print(sorteados[i] +  " ");
        }
        System.out.println();

    }


}