编程中十大常用算法:(二)分治算法

理论介绍

分治算法在日常的编程中经常被使用,观其名知:“分而治之”,将一个复杂的问题分为多个相同或者相似的子问题,在将子问题划分为更小的子问题,直至最后的子问题可以简单的直接求解,子问题的解合并即为原问题的解。

经典运用

1.汉诺塔
2.合并排序
3.快速排序
4.棋盘覆盖
5.循环赛日程表
6.二分搜索
7.最接近点对问题等等…

分治算法的基本步骤

分治算法在每一次递归上都有三个步骤
(1)分解:将原问题分解为若干个规模较小且相互独立、与原问题形式相同的子问题
(2)解决:若子问题规模较小且容易解决则直接解决,否则递归地解决各个子问题。
(3)合并:将各个子问题的解合并为原问题的解

实际演示(汉诺塔问题)

要求:(1)将A塔上的所有圆盘移动到C塔。
(2)小圆盘上不能放大圆盘
(3)在三根柱子之间一次只能移动一个圆盘 在这里插入图片描述
## 代码实现(Java)

package com.zq.ten_Algorithms;
 
public class HanoTa {

 public static void main(String[] args) {

     move(5, 'A', 'B', 'C');

  }

   static int times=1;

  //利用分治算法移动盘子

  public static void move(int num,char a,char b,char c) {

     if (num==1) {

       System.out.println("第"+(times++)+"次"+"由"+a+"移动到"+c);

     }else {

       //当盘数大于等于2时,总是将所有的盘看做是两个盘:一个是最下面的盘under,另一个为除最下面之外所有的盘top

       //1.利用塔C,将top的盘由A移动到B,

       move(num-1, a, c, b);

       //2.把最下面的盘under由A移动到C

       System.out.println("第"+(times++)+"次"+"由"+a+"移动到"+c);

       //3.利用塔A,将B塔上所有的盘,由B移动到C

       move(num-1, b, a, c);

     }

  }

}

结果

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值