#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
/*
(tr, tc): 棋盘左上角的行号,列号
(dr, dc): 棋盘右上角的行号,列号
size:当前棋盘的大小 = 2 ^k
*/
#define EDGE_LEN 8
int board[EDGE_LEN][EDGE_LEN];
int title = 0;
void putArray()
{
for(int i = 0; i < EDGE_LEN; i++)
{
for(int j = 0; j < EDGE_LEN; j++)
{
printf("%4d", board[i][j]);
}
printf("\n");
}
}
void chessBoard(int tr, int tc, int dr, int dc, int size)
{
if(size == 1)
return;
int s = size / 2; //分割棋盘,长宽都变为一半
int t = ++title; //L型骨牌的编号
//如果L型骨牌在左上角
if(dr < tr + s && dc < tc + s)
chessBoard(tr, tc, dr, dc, s);
else//否则将其右下角填充(是L型骨牌的一部分,与另外三个不存在特殊方格的形成L型骨牌),构造一个特殊方格
{
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);
}
}
int main()
{
for(int i = 0; i < EDGE_LEN; i++)
{
for(int j = 0; j < EDGE_LEN; j++)
{
board[i][j] = -1;
}
}
board[0][0] = 0;
chessBoard(0, 0, 0, 0, EDGE_LEN );
putArray();
system("pause");
return 0;
}
详情,请参考《苏犯法设计与分析》