算法——分治法讲解

来源:互联网 发布:通过网络社会治理案例 编辑:程序博客网 时间:2024/05/23 16:29

分治法

分治法是一个很有趣的算法方法。
分治法的思想很简单,就是将问题分成多个规模大小一样的子问题。这种做法是出自一种平衡子问题的启发思想。
然后这么多个规模大小一样的子问题就可以通过递归进行求解。下面举个小例子:

例如:现在要求3的4次幂。
蛮力法的思想:3*3*3*3
分治法的思想:
这里写图片描述

可能说起来比较抽象。我下面给出几个例子的代码,通过观察你就会慢慢知道分治法的思想核心和使用它了。

数字旋转方阵

效果图:
这里写图片描述

说明:
这里主要将方阵的四周分成四个区域:A区域、B区域、C区域、D区域。然后里面每一层都是一样的子问题。就可以采用递归输出结果了。

代码:

import java.util.Scanner;/** * 分治法——数字旋转方正算法 *  * @author chenjunxu * @since 2016-1-20 */public class Main {    /** 用于记录输出的数字 */    private static int number = 1;    public static void main(String[] args) {        Scanner scan = new Scanner(System.in);        int n = scan.nextInt();        scan.close();        // 创建二维数组(方阵)        int arr[][] = new int[n][n];        // 调用方阵递归方法        huizhuang(0, n, arr, n);        // 输出二维数组(方阵)        for (int i = 0; i < n; i++) {            for (int j = 0; j < n; j++) {                System.out.print(arr[i][j] + " ");            }            System.out.println();        }    }    public static void huizhuang(int begin, int size, int arr[][], int n) {        // 如果方阵的长度等于0,则停止递归(递归出口)        if (size == 0) {            return;        }        // 如果方阵的长度等于1,则将该数字输出并结束递归(递归出口)        if (size == 1) {            arr[begin][begin] = number++;            return;        }        // A区域代码输出        for (int i = begin; i < n - 1; i++) {            arr[i][begin] = number++;        }        // B区域代码输出        for (int i = begin; i < n - 1; i++) {            arr[n - 1][i] = number++;        }        // C区域代码输出        for (int i = n - 1; i > begin; i--) {            arr[i][n - 1] = number++;        }        // D区域代码输出        for (int i = n - 1; i > begin; i--) {            arr[begin][i] = number++;        }        // 进行递归        huizhuang(begin + 1, size - 2, arr, n - 1);    }}

如果一次看不懂,就慢慢专研,学会怎么做。然后,自己动手做一下,你就会知道其中的道理了。~(>.<)~加油~

0 0
原创粉丝点击