目录
一.棋盘覆盖问题
在一个2^kx2^k (k>=1) 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一将殊方格,且称该棋盘为一特珠棋盘。
在棋盘覆盖问翻中,要用图示的4种不同形志的L型骨牌盖特殊棋盘上的所有方格特殊方格除外)且任何2个L型骨牌不得重叠覆盖。
当k=1时,行数和列数都为2^1=2
当k=2时,行数和列数都为2^2=4
棋盘覆盖问题一一实现思路
当k>0时,将2^k×2^k棋盘分割为4个2^(k-1)×2^(k-1)子棋盘(a)所示。特殊方格必位干4个较小子盘之一中,其余3个子盘中无特豫方格。
为了将这3个无挥脉方格的子棋含转化为特盘,可以用一个L型骨牌覆盖这3个较小棋盘约会合处,如(b)所示,从将原问转化为4个较小观模的棋盘覆盖问题。
递归地使用这种分割,直至子棋盘都是2*2大小结束。
棋盘覆盖——时间复杂度分析
解上述递归方程,结果为T(n)=O(4^k)
例:
请画出使用L型骨牌对下图进行填充的结果。
结果为:
二.快速幂算法:
用分治法求a的n次方,要求输出a的n次方的值,检查输出结果的正确性。
#include<stdio.h>
#include<stdlib.h>
int fac(int a,int n){
int result;
if(n==1){
return a;
}
else if(n==0){
return 1;
}
else if(n%2==0){
result=fac(a,n/2)*fac(a,n/2);
return result;
}
if(n%2==1){
result=fac(a,(n-1)/2)*fac(a,(n-1)/2)*a;
return result;
}
}
int main(){
int a,n,result;
printf("请输入a的值:");
scanf("%d",&a);
printf("请输入n的值:");
scanf("%d",&n);
result=fac(a,n);
printf("a^n=%d",result);
return 0;