目录
分治法的思路:
数字旋转方阵基本思想:
分治法的思路
- 分解:将原问题分解成若干个规模较小,相互独立,与原问题相同的子问题
- 求解:如果这些子问题较小且易解决则直接求解,否则再继续划分成更小的子问题,直到容易解决
- 合并:将已求解的各个子问题的解自底向上地逐步合并形成原问题的解
数字旋转方阵基本思想
- 从外层向里层填入数字,将每一层的填数过程分为A、B、C、D四个区域,每个区域填写size-1个数
- A区域:列不变行加1
- B区域:行不变列加1
- C区域:列不变行减1
- D区域:行不变列减1
- 每填完一圈size=size-2,begin=begin+1
package test2;
import java.util.Scanner;
class Full{
public static work2 ss=new work2();//实例化了一个main类,用于调用main类中的公共数组,就不需要每次递归重新创建数组,而且递归依次创建一个数组,他们改变的都不会再一个数组里呈现
static void full(int number,int begin,int size) {
int i,j,k;
if (size==0) return;//递归的边界值,若size=0,无需填写
if(size==1) { //递归的边界值,若size=1,只需填写number
ss.data[begin][begin]=number;
}
i=begin;j=begin;//初始化第一个元素的下标
for(k=0;k<size-1;k++) {//填写区域A,共填写size-1个数
ss.data[i][j]=number;
number++;i++; //行加1
}
for(k=0;k<size-1;k++) {//填写区域B,共填写size-1个数
ss.data[i][j]=number;
number++;j++;//列加1
}
for(k=0;k<size-1;k++) {//填写区域C,共填写size-1个数
ss.data[i][j]=number;
number++;i--;//行减1
}
for(k=0;k<size-1;k++) {//填写区域D,共填写size-1个数
ss.data[i][j]=number;
number++;j--; //列减1
}
full(number,begin+1,size-2);//递归求解,左上角下标为begin+1
}
}
public class work2 {
static Scanner a = new Scanner(System.in);
//System.out.print("请输入想要的方阵大小:");
static int size=a.nextInt();
public static int data[][]=new int[size][size];//定义方阵是一个size*size的二维数组
public static void main(String[]args) {
Full f = new Full();
f.full(1, 0, size);
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
System.out.printf("%-5d",data[i][j]);//规定了输出数据的宽度为5
System.out.println("\n");
}
}
}