[Conception et analyse d'algorithmes (réponse après le cours)] Récursivité

1. Résolvez le problème de la matrice en spirale d'ordre n

[Description du problème] Créez une matrice en spirale d'ordre n et affichez-la.

[Description de l'entrée] L'entrée contient plusieurs cas de test, chaque cas de test est une ligne et contient un entier positif n (1 ≤ n ≤ 50), et entrez 0 pour indiquer la fin.
[Description de la sortie] Chaque cas de test produit n lignes, chaque ligne comprend n entiers et les entiers sont séparés par un espace.

[Exemple d'entrée] 4
[Exemple de sortie] 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. Résolvez le problème du nombre porte-bonheur

[Description du problème] Après avoir appris différentes bases, Xiao Ming a pris quelques chiffres et a commencé le jeu. Xiao Ming sait que dans la vie quotidienne, nous utilisons le plus souvent des nombres décimaux, et dans les ordinateurs, les nombres binaires sont également très couramment utilisés. Maintenant pour un nombre x, Xiao Ming a défini deux fonctions f (x) et g (x). f (x) représente la somme des chiffres de chaque chiffre après que le nombre x soit écrit en décimal. Par exemple, f (123) = 1 + 2 + 3 = 6. g (x) représente la somme des nombres sur chaque chiffre après que le nombre x soit écrit en binaire. Par exemple, la représentation binaire de 123 est 1111011, alors g (123) = 1 + 1 + 1 + 1 + 0 + 1 + 1 = 6. Xiao Ming a découvert que pour certains nombres entiers positifs x satisfait f (x) = g (x), il a appelé ces nombres nombres chanceux. Maintenant, il veut savoir combien de nombres chanceux sont inférieurs ou égaux à n?

【Entrez la description】 n (n≤100000).
[Description de l'entrée] Le nombre de nombres chanceux inférieur ou égal à n.
【Échantillon d'entrée】 21
【Échantillon d'entrée】 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. Résoudre le problème de la séquence palindrome

[Description du problème] Si une séquence numérique est la même que la séquence originale après l'inversion, alors une telle séquence numérique est appelée une séquence palindrome. Par exemple, {1,2,1}, {15,78,78,15}, {11,2,11} sont des séquences palindromes, et {1,2,2}, {15,78,87,51} , {112,2,11} n'est pas une séquence palindrome. Maintenant, donnez une séquence de nombres, permettant une opération de conversion: sélectionnez deux nombres adjacents quelconques, puis supprimez ces deux nombres de la séquence, et insérez la somme de ces deux nombres dans la position avant les deux (Insérez un seul et). Trouvez le nombre minimum d'opérations requises pour une séquence donnée pour en faire une séquence palindrome.

[Description de l'entrée]: L'entrée est de deux lignes, la première ligne est la longueur de la séquence n (1≤n≤50), la deuxième ligne est n élément entier [i] (1≤item [i] ≤1000) dans la séquence , avec un espace séparé.
[Description de la sortie]: affiche un nombre, indiquant le nombre minimum de conversions requises.

【Exemple d'entrée】 4
         1 1 1 3
【Exemple de sortie】 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. Résolvez le problème du jeu de dés

[Description du problème] Le joueur décide du nombre de pas effectués en fonction du nombre de points de dés, c'est-à-dire qu'un pas peut être fait lorsque le nombre de dés est 1, deux pas peuvent être effectués lorsque le nombre est 2, et n pas peut être pris lorsque le nombre est n. Demandez au joueur d'atteindre la nième étape (n ≤ le nombre maximum de dés et la seule façon de lancer les dés), combien de façons de lancer les dés au total.

[Description de l'entrée]: L'entrée comprend un entier n (1≤n≤6).
[Description de la sortie]: affiche un nombre entier, ce qui signifie le nombre de façons de lancer les dés.

[Échantillon d'entrée]: 6
[Échantillon de sortie]: 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));
    }
}

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

⭐️ Cela doit être la plus belle solution Java de tout le réseau> _ <

Je suppose que tu aimes

Origine blog.csdn.net/m0_46202073/article/details/114996082
conseillé
Classement