分治算法应用

一:大整数乘法问题

 

package 算法;

public class BigIntegerMultiplication {
    public static void main(String[] args) {
        long x=12345678;
        long y=12345678;

       // System.out.println(x*y);//152415765279684
        long product =multi(x,y,4);
        System.out.println(product);//152415765279684


    }
   //每执行一次multi()函数,都将4个n/2变为3个n/2,逐渐使复杂度降低
    private static long multi(long x, long y, int n) {
        //n表示的是深度,也就是数字的个数
        if(x==0||y==0){
            return 0;
        }
        if(n==1){
            return  x*y;
        }
        long A=(long)(x/Math.pow(10,n/2));//12
        long B =(long)(x-A*Math.pow(10,n/2));//34
        long C=(long)(y/Math.pow(10,n/2));//12
        long D =(long)(y-C*Math.pow(10,n/2));//34
        long E =multi(A,C,   n/2);
        long F =multi(B,D,n/2);
        long G =multi(A+B,C+D,n/2);
        return (long)( E *Math.pow(10,n)+(G-E-F)*Math.pow(10,n/2)+F);

    }
}

二:全排列问题

ABC的全排列有:

ABC,ACB,BAC,BCA,CBA,CAB

代码如下:

package 算法;

import java.util.TreeSet;

public class FullPermutation {
    private static TreeSet<String> set =new TreeSet<>();
    public static void main(String[] args) {
         String s="ABB";
        char [] arr=s.toCharArray();
        permutition(arr,0,arr.length-1);

    }

    private static void permutition(char[] arr, int  from, int to) {
      if(from==to){
//         System.out.println( String.valueOf(arr));
           set.add(String.valueOf(arr));
           for(String ss:set){
               System.out.println(ss);
           }
      }
      for(int i=from;i<=to;i++){
          swap(arr,i,from);
          permutition(arr,from+1,to);
          swap(arr,i,from);//换了之后还必须要换回来,主要是为了不要影响下一轮的交换
      }


    }

    private static void swap(char[] arr, int i, int from) {
        char temp=arr[i];
        arr[i]=arr[from];
        arr[from]=temp;


    }

}

棋盘覆盖问题

 三:棋盘覆盖的问题

package 算法;

import java.util.Scanner;

/**
 * 利用分治法将方形棋盘分为四个部分
 * 如果该特殊点在其中的某一部分,我们就接着去递归处理即可
 * 如果该不存在特殊点的部分,我们就假设一个特殊点,同样的去递归下去即可
 * 直到全覆盖为止
 * 左上角的棋盘,若不存在特殊点,该棋盘的右下角为特殊点
 * 右上角的棋盘,若不存在特殊点,该棋盘的左下角为特殊点
 * 左下角的棋盘,若不存在特殊点,该棋盘的上角为特殊点
 * 右下角的棋盘,若不存在特殊点,该棋盘的左上角为特殊点
 */
public class ChessboardCoverage {
    //定义一个棋盘的大小
    private static int BOARD_SIZE=8;
    //定义一个二维数组模拟棋盘
    private static int[][]board =new int [BOARD_SIZE][BOARD_SIZE];
    //定义一个骨牌的编号
    private static int title =0;
    public static void main(String[] args) {
        Scanner input =new Scanner(System.in);
        System.out.println("棋盘的大小:"+BOARD_SIZE);
        System.out.println("输入特殊方格的行号:");
        int dr =input.nextInt();
        System.out.println("输入特殊方格的列号:");
        int dc=input.nextInt();
        //开始用递归解决问题
        chessBoard(0,0,dr-1,dc-1,BOARD_SIZE);
    }
    private static void chessBoard(int tr, int tc, int dr, int dc, int size) {
        //i,i2指的是方形的左上角的坐标
        //dr,dc指的是特殊方格的坐标
        //size指的是当前方格的尺寸
        if (BOARD_SIZE == 1) {
            return;
        }
        //当前层级下的骨牌编号
        int num = ++title;
        //方格的尺寸
        int s = BOARD_SIZE / 2;
        //1,左上角
        if (dr < tr + s && dc < tc + s) {
            chessBoard(tr, tc, dr, dc, s);
        } else {
            //特殊方格不在左上角
            board[tr + s - 1][tc + s - 1] = num;
            chessBoard(tr, tc, tr + s - 1, tc + s - 1, s);
        }
        //2,右上角
        if (dr < tr + s && dc >= tc + s) {
            chessBoard(tr, tc + s, dr, dc, s);
        } else {
            //特殊方格不在左上角
            board[tr + s - 1][tc + s] = num;
            chessBoard(tr, tc + s, tr + s - 1, tc + s, s);
        }
        //3,坐下角
        if (dr >= tr + s && dc < tc + s) {
            chessBoard(tr + s, tc, dr, dc, s);
        } else {
            //特殊方格不在左下角
            board[tr + s][tc + s - 1] = num;
            chessBoard(tr + s, tc, tr + s, tc + s - 1, s);
        }
        //4  右下角
        if (dr >= tr + s && dc >= tc + s) {
            chessBoard(tr + s, tc + s, dr, dc, s);
        } else {
            //特殊方格不在左上角
            board[tr + s][tc + s] = num;
            chessBoard(tr + s, tc + s, tr + s, tc + s, s);
        }
    }
     private static void print(){
            for(int i=0;i<BOARD_SIZE;i++){
                for(int j=0;j<BOARD_SIZE;j++){
                    System.out.print(board[i][j]);
            }
                System.out.println();
        }

            }
}

四,汉诺塔问题

package 算法;

public class Hanoi {
    public static void main(String[] args) {
        String x="X";
        String y="Y";
        String z="Z";
        hanota(64,x,y,z);
    }
    private static void hanota(int level, String begin, String mid, String end) {
       if(level==1){
           System.out.println(begin+"----->"+end);
       }
   else{
       hanota(level-1,begin,end,mid);
       //第level层的
           System.out.println(begin+"----->"+end);
           hanota(level-1,mid,begin,end);
       }

    }
}

猜你喜欢

转载自blog.csdn.net/qq_37244548/article/details/106719450