#include <stdio.h>
int board[8][8];
int tile=1;
void chessBoard(int tr, int tc, int dr, int dc, int size)
{ //行列的标号从0开始使用
//tr、tc确定此时棋盘的左上角位置(tr:行号 tc:列号)
//dr、dc表示此时骨牌在位置(dr,dc)
// size表示此时棋盘大小为size*size
int s,t;
if(size==1) return;
s=size/2;
t=tile++;
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);
}
}
void display()//展示表board执行后的结果
{
int r,c;
for(r=0;r<8;r++)
{
for(c=0;c<8;c++)
printf("%2d ",board[r][c]);
printf("\n");
}
}
int main()
{
chessBoard(0,0,0,0,8);//最后的两个0表示骨牌最初在(0行,0列)的位置
display();
return 0;
}
棋盘覆盖问题(L型骨牌)
最新推荐文章于 2023-11-28 20:35:41 发布