设一个n*n棋盘,n=2^k,用L 型条块覆盖棋盘中除一个指定方格外的所有方格,每个L型条块可恰好覆盖3 个方格。例:假设n=8,指定左上角不能被覆盖,棋盘的一种覆盖方式如下。![]()
![]()
运用了递归回溯的思想
#include "stdio.h"
#define N 8
int a[N][N];
int chessBoard(int tr,int tc,int dr,int dc,int s,int t)
{
if(s==0)
return 0;
if(dr<tr+s && dc<tc+s) //左上角
chessBoard(tr,tc,dr,dc,s/2,t+1);
else
{
a[tr+s-1][tc+s-1]=t;
chessBoard(tr,tc,tr+s-1,tc+s-1,s/2,t+1);
output();
}
if(dr<tr+s && dc>tc+s-1) //左下角
chessBoard(tr,tc+s,dr,dc,s/2,t+1+s*s);
else
{
a[tr+s-1][tc+s]=t;
chessBoard(tr,tc+s,tr+s-1,tc+s,s/2,t+1+s*s);
output();
}
if(dr>tr+s-1 && dc<tc+s) //右上角
chessBoard(tr+s,tc,dr,dc,s/2,t+1+2*s*s);
else
{
a[tr+s][tc+s-1]=t;
chessBoard(tr+s,tc,tr+s,tc+s-1,s/2,t+1+2*s*s);
output();
}
if(dr>tr+s-1 && dc>tc+s-1) //右下角
chessBoard(tr+s,tc+s,dr,dc,s/2,t+1+3*s*s);
else
{
a[tr+s][tc+s]=t;
chessBoard(tr+s,tc+s,tr+s,tc+s,s/2,t+1+3*s*s);
output();
}
}
int output()
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[j][i]);
putchar('\n');
}
putchar('\n');
return 0;
}
int main()
{
int i,j;
int dr,dc,tr,tc,s;
int t=1;
s=N;
dr=3;
dc=0;
tr=tc=0;
a[6][6]=0;
chessBoard(tr,tc,dr,dc,s/2,t);
output();
return 0;
}