分治法——旋转方阵(Java)

目录

分治法的思路:

                                        

数字旋转方阵基本思想:


分治法的思路

  1. 分解:将原问题分解成若干个规模较小,相互独立,与原问题相同的子问题
  2. 求解:如果这些子问题较小且易解决则直接求解,否则再继续划分成更小的子问题,直到容易解决
  3. 合并:将已求解的各个子问题的解自底向上地逐步合并形成原问题的解


                                        

数字旋转方阵基本思想

  1. 从外层向里层填入数字,将每一层的填数过程分为A、B、C、D四个区域,每个区域填写size-1个数
  2. A区域:列不变行加1
  3. B区域:行不变列加1
  4. C区域:列不变行减1
  5. D区域:行不变列减1
  6. 每填完一圈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");
        }    
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值