【算法】详解分治算法

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。简单问题可用二分法

完成。

分治法解题的一般步骤:

(1)分解,将要解决的问题划分成若干规模较小的同类问题;

(2)求解,当子问题划分得足够小时,用较简单的方法解决;

(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

例题:找出伪币

求最值

传统方法:

void maxmin1(int A[],int n,int *max,int *min)
{
int i;
*min=*max=A[0];
for(i=0;i <= n;i++)
{
if(A[i]> *max) *max= A[i];
if(A[i] < *min) *min= A[i];
}
}

分治法:

void maxmin2(int A[],int i,int j,int *max,int *min)
/*A存放输入的数据,i,j存放数据的范围,初值为0,n-1,*max,*min 存放最大和最小值*/
{
int mid,max1,max2,min1,min2;
if (j==i)
{
最大和最小值为同一个数;
return;
}
if (j-1==i)
{
将两个数直接比较,求得最大和最小值;
return;
}

*棋盘覆盖、

在一个(2k)*(2k)个方格组成的棋盘上,有一个特殊方格与其他方格不同,称为特殊方格,称这样的棋盘为一个特殊棋盘。我们要求对棋盘的

其余部分用L型方块填满(注:L型方块由3个单元格组成。即围棋中比较忌讳的愚形三角,方向随意),且任何两个L型方块不能重叠覆盖。

L型方块的形态如下:

题目的解法使用分治法,即子问题和整体问题具有相同的形式。我们对棋盘做一个分割,切割一次后的棋盘如图1所示,我们可以看到棋盘

被切成4个一样大小的子棋盘,特殊方块必定位于四个子棋盘中的一个。假设如图1所示,特殊方格位于右上角,我们把一个L型方块(灰色

填充)放到图中位置。这样对于每个子棋盘又各有一个“特殊方块”,我们对每个子棋盘继续这样分割,直到子棋盘的大小为1为止。

用到的L型方块需要(4^k-1)/3 个,算法的时间是O(4^k),是渐进最优解法。

本题目的C语言的完整代码如下(TC2.0下调试),运行时,先输入k的大小,(1<=k<=6),然后分别输入特殊方格所在的位置(x,y), 0<=x,y<=

(2^k-1)。

#include<stdio.h>
//#include<conio.h>
//#include<math.h>
inttitle=1;
intboard[64][64];
voidchessBoard(inttr,inttc,intdr,intdc,intsize){
ints,t;
if(size==1)return;
t=title++;s=size/2;
if(dr<tr+s&&dc<tc+s)
chessBoard(tr,tc,dr,dc,s);
else
{
board[tr+s-1][tc+s-1]=t;
chessBoard(tr,tc,tr+s-1,tc+s-1,s);
}
if(dr<tr+s&&dc>=tc+s)
chessBoard(tr,tc+s,dr,dc,s);
else
{
board[tr+s-1][tc+s]=t;
chessBoard(tr,tc+s,tr+s-1,tc+s,s);
}
if(dr>=tr+s&&dc<tc+s)
chessBoard(tr+s,tc,dr,dc,s);
else
{
board[tr+s][tc+s-1]=t;
chessBoard(tr+s,tc,tr+s,tc+s-1,s);
}
if(dr>=tr+s&&dc>=tc+s)
chessBoard(tr+s,tc+s,dr,dc,s);
else
{
board[tr+s][tc+s]=t;
chessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
voidmain(){
intdr=0,dc=0,s=1,i=0,j=0;
printf("printinthesizeofchess:\n");
scanf("%d",&s);
printf("printinspecalpointx,y:\n");
scanf("%d%d",&dr,&dc);
if(dr<s&&dc<s)
{
chessBoard(0,0,dr,dc,s);
for(i=0;i<s;i++)
{
for(j=0;j<s;j++){
printf("%4d",board[i][j]);
}
printf("\n");
}
}
else
printf("thewrongspecalpoint!!\n");
getch();
}

微信公众号“计算机基础学”关注我哟

发布了57 篇原创文章 · 获赞 13 · 访问量 3177

猜你喜欢

转载自blog.csdn.net/qq_41985559/article/details/101994194