[Projeto e análise de algoritmo (resposta depois da aula)] Recursão

1. Resolva o problema da matriz espiral de ordem n

[Descrição do problema] Crie uma matriz espiral de ordem n e imprima-a.

[Descrição da entrada] A entrada contém vários casos de teste, cada caso de teste é uma linha e contém um número inteiro positivo n (1≤n≤50) e insira 0 para indicar o fim.
[Descrição da saída] Cada caso de teste produz n linhas, cada linha inclui n inteiros e os inteiros são separados por um espaço.

[Amostra de entrada] 4
[Amostra de saída] 1 2 3 4
         12 13 14 5
         11 16 15 6
         10 9 8 7

public class Solution1 {
    
    
	/**
     * 目前已知最优雅的写法
     * Left-Right-Top-Down螺旋模板
     */	
    public int[][] CreateSpiral(int n) {
    
    
        int[][] res = new int[n][n];

        int L = 0;
        int R = n - 1;
        int T = 0;
        int D = n - 1;

        int index = 1;
        int remain = n * n;
        while (remain > 0) {
    
    
            for (int i = L; i <= R && remain > 0; i++) {
    
    
                res[T][i] = (index++);
                remain--;
            }
            T++;
            for (int i = T; i <= D && remain > 0; i++) {
    
    
                res[i][R] = (index++);
                remain--;
            }
            R--;
            for (int i = R; i >= L && remain > 0 ; i--) {
    
    
                res[D][i] = (index++);
                remain--;
            }
            D--;
            for (int i = D; i >= T && remain > 0; i--) {
    
    
                res[i][L] = (index++);
                remain--;
            }
            L++;
        }
        return res;
    }

    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        while (true) {
    
    
            int n = sc.nextInt();
            if (n == 0) {
    
    
                break;
            }
            int[][] res = new Solution1().CreateSpiral(n);
            for (int i = 0; i < n; i++) {
    
    
                for (int j = 0; j < n; j++) {
    
    
                    System.out.print(res[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
}

 


2. Resolva o problema do número da sorte

[Descrição do problema] Depois de aprender diferentes bases, Xiao Ming pegou alguns números e começou o jogo. Xiao Ming sabe que, na vida diária, usamos os números decimais com mais frequência e, nos computadores, os números binários também são usados ​​com muita frequência. Agora, para um número x, Xiao Ming definiu duas funções f (x) e g (x). f (x) representa a soma dos dígitos em cada dígito depois que o número x é escrito em decimal. Por exemplo, f (123) = 1 + 2 + 3 = 6. g (x) representa a soma dos números em cada dígito depois que o número x é escrito em binário. Por exemplo, a representação binária de 123 é 1111011, então g (123) = 1 + 1 + 1 + 1 + 0 + 1 + 1 = 6. Xiao Ming descobriu que para alguns números inteiros positivos x satisfaz f (x) = g (x), ele chamou esses números de números da sorte. Agora ele quer saber quantos números da sorte são menores ou iguais a n?

【Insira a descrição】 n (n≤100000).
[Descrição da entrada] O número de números da sorte menor ou igual a n.
【Amostra de entrada】 21
【Amostra de entrada】 3

public class Solution2 {
    
    
	/**
     * 每一个数都判断是否是LuckyNumber即可,非常简单~
     */	
    public int getLuckyNumber(int n) {
    
    
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
    
    
            cnt += (f(i) == g(i) ? 1 : 0);
        }
        return cnt;
    }

    private int f(int n) {
    
    
        if (n < 10) {
    
    
            return n;
        }
        return n % 10 + f(n / 10);
    }

    private int g(int n) {
    
    
        if (n < 2) {
    
    
            return n;
        }
        return  n & 1 + g(n >> 1);
        // 位运算永远的神
    }


    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(new Solution2().getLuckyNumber(n));
    }
}

 


3. Resolva o problema da sequência do palíndromo

[Descrição do problema] Se uma sequência digital for igual à sequência original após a inversão, essa sequência digital é chamada de sequência de palíndromo. Por exemplo, {1,2,1}, {15,78,78,15}, {11,2,11} são sequências de palíndromos e {1,2,2}, {15,78,87,51} , {112,2,11} não é uma sequência de palíndromo. Agora forneça uma sequência de números, permitindo uma operação de conversão: selecione quaisquer dois números adjacentes, remova esses dois números da sequência e insira a soma desses dois números na posição antes dos dois (insira apenas um e). Encontre o número mínimo de operações necessárias para uma determinada sequência para transformá-la em uma sequência de palíndromo.

[Descrição da entrada]: A entrada é de duas linhas, a primeira linha é o comprimento da sequência n (1≤n≤50), a segunda linha é n item inteiro [i] (1≤ item [i] ≤1000) na sequência , com um espaço Separado.
[Descrição de saída]: envia um número, indicando o número mínimo de conversões necessárias.

【Amostra de entrada】 4
         1 1 1 3
【Amostra de saída】 2

public class Solution3 {
    
    
	/**
     * 每次计算最外面的一层,递归内层
     */
    public int trans2palindrome(int[] arr, int L, int R) {
    
    
        if (L >= R) {
    
    
            return 0;
        }
        int res = 0;
        int sumL = arr[L++];
        int sumR = arr[R--];
        while (L <= R) {
    
    
            if (sumL < sumR) {
    
    
                sumL += arr[L++];
                res++;
            } else if (sumL > sumR) {
    
    
                sumR += arr[R--];
                res++;
            } else {
    
    
                break;
            }
        }
        return res + trans2palindrome(arr, L, R);
    }

    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int len = sc.nextInt();
        int[] arr = new int[len];
        for (int i = 0; i < len; i++) {
    
    
            arr[i] = sc.nextInt();
        }
        System.out.println(new Solution3().trans2palindrome(arr, 0, len -1));
    }
}

 


4. Resolva o problema do jogo de dados

[Descrição do problema] O jogador decide o número de passos dados de acordo com o número de pontos do dado, ou seja, um passo pode ser dado quando o número de dados for 1, dois passos podem ser dados quando o número for 2 e n passos pode ser obtido quando o número é n. Peça ao jogador para atingir a enésima etapa (n ≤ o número máximo de dados e a única maneira de rolar os dados), quantas maneiras de rolar os dados no total.

[Descrição da entrada]: A entrada inclui um número inteiro n (1≤n≤6).
[Descrição da saída]: Produz um número inteiro, o que significa o número de maneiras de lançar os dados.

[Amostra de entrada]: 6
[Amostra de saída]: 32

public class Solution4 {
    
    
	/**
     * 回溯的最简单最初始版本———不需要记录路径,仅需要记录个数
     */
    public int ThrowDice(int n) {
    
    
        return traceBack(n);
    }

    private int traceBack(int remain) {
    
    
        if (remain == 0) {
    
    
            return 1;
        }
        int sum = 0;
        for (int i = 1; i <= 6 && i <= remain; i++) {
    
    
            sum += traceBack(remain - i);
        }
        return sum;
    }

    public static void main(String[] args) {
    
    
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(new Solution4().ThrowDice(n));
    }
}

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

⭐️ Esta deve ser a solução Java mais bonita em toda a rede> _ <

Acho que você gosta

Origin blog.csdn.net/m0_46202073/article/details/114996082
Recomendado
Clasificación