分治法
分治法是一个很有趣的算法方法。
分治法的思想很简单,就是将问题分成多个规模大小一样的子问题。这种做法是出自一种平衡子问题的启发思想。
然后这么多个规模大小一样的子问题就可以通过递归进行求解。下面举个小例子:
例如:现在要求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);
}
}
如果一次看不懂,就慢慢专研,学会怎么做。然后,自己动手做一下,你就会知道其中的道理了。~(>.<)~加油~