问题描述:在一个2k×2k (k≥0)个方格组成的棋盘中,有一个方格与其他不同,称该方格为特殊方格。显然,特殊方格在棋盘中可能出现的位置有4k种情形,因而对任何K>=0来说有4k种不同的棋盘。棋盘覆盖问题(chess cover problem)要求用4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define N 8
int Board[N][N];//定义一个棋盘
int tile = 1; //表示骨牌的型号
void ChessBoard(int r, int c, int fr, int fc, int size);
//r表示棋盘左上角行号,c表示棋盘左上角列号,fr表示特殊方格所在行号,fc表示特殊方格所在列号,size棋盘规格
int main()
{
//将棋盘各方格初始化为0
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
Board[i][j] = 0;
ChessBoard(0, 0, 2, 3, N);
//输出棋盘
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
printf("%d\t", Board[i][j]);
printf("\n");
}
system("PAUSE"); //因编译器原因,防止运行结果闪退
}
void ChessBoard(int r, int c, int fr, int fc, int size)
{
if (size == 1)
return;
int t = tile++; //本列用相同数字表示骨牌
int s = size / 2;
if (fr < r + s && fc < c + s) //特殊方格在此小棋盘内
ChessBoard(r, c, fr, fc, s);
else //特殊方格不在此棋盘
{
Board[r + s - 1][c + s - 1] = t; //用t号骨牌覆盖右下角
ChessBoard(r, c, r + s - 1, c + s - 1, s); //继续覆盖其余方格
}
//后面三个if-else类似于第一个
if (fr >= r + s && fc < c + s)
ChessBoard(r+s, c, fr, fc, s);
else
{
Board[r + s][c + s - 1] = t;
ChessBoard(r+s, c, r + s, c + s - 1,s);
}
if (fr<r + s && fc>=c + s)
ChessBoard(r, c+s, fr, fc, s);
else
{
Board[r + s - 1][c + s] = t;
ChessBoard(r, c+s, r + s - 1, c + s,s);
}
if (fr >= r + s && fc >= c + s)
ChessBoard(r+s, c+s, fr, fc, s);
else
{
Board[r + s][c + s] = t;
ChessBoard(r+s, c+s, r + s, c + s,s);
}
}
本文提供的为基础解法,参照教材计算机算法设计与分析第五版-王晓东