分治法

来源:互联网 发布:sqlserver导入数据 编辑:程序博客网 时间:2024/05/17 07:43

分治法:

1)   将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模

2)   对这些较小的实例求解(一般使用对贵方法,但在问题规模足够小的时候,有时候会利用另一个算法)。

3)   如果必要的话,合并这些较小问题的求解,已得到原始问题的解

1.      归并排序

算法:

mergeSort(A,n)

//用对贵调用对数组 A进行排序

//输入:一个待排序的数组 A,n 为数组元素个数

//输出: 一个已排序数组 A

if n >1

     copyA[0,1,..n/2-1]  to  B[0,1…n/2-1]

     copyB[n/2,….n-1]  to  C[0,1…n-n/2]

     mergeSort(B,n/2)

     mergeSort(C,n-n/2)

     merge(B,n/2,C,n-n/2,A,n)

 

Tromino谜题 Tromino是一个有棋盘上的三个邻接方块组成的L型瓦片。我们的问题是,如何用Tromino覆盖一个缺少了一个方块(可以在棋盘上的任何位置)的2^n*2^n棋盘。除了这个缺失的方块,Tromino应该覆盖棋盘上的所有方块,而且不能重叠。

Tromino(n,i,j)

//用递归来求解Tromino问题

//输入:其反的大小n(即:2^n*2^n),缺失方块的位置i,j

ifn=1

     return //此时只需要一个L瓦片填充非缺失快即可

//否则棋盘将分成4个区域,其中一个包含缺失方块

//第一个区域,判断缺失方块是否在其中

ifi<=2^(n-1)-1 and  j<=2^(n-1)-1   //缺失方块在区域中

     Tromino(n-1,i,j)

Tromino(n-1,2^(n-1)-1,2^(n-1)-1)  //让右下角的方块空缺,目的是让这个方块与其他3个区域的方块组成一个 L 型瓦片

//第二个区域

ifi>2^(n-1)-1 and j<=2^(n-1)-1

     Tromino(n-1,i-2^(n-1),j)

Tromino(n-1,0,2^(n-1)-1)

//第三个区域

if  i<=2^(n-1)-1 and j>2^(n-1)-1

     Tromino(n-1,i,j-2^(n-1))

Tromino(n-1,0,2^(n-1)-1)

//第四个区域

if  i>2^(n-1)-1 and j>2^(n-1)-1

     Tromino(n-1,i-2^(n-1),j-2^(n-1))

Tromino(n-1,0,0)

原创粉丝点击