#include "stdio.h"
#include "string.h"
const int N = 11;
int board[N][N]; //棋盘布局
int tile = 0; //覆盖时所用的方块,编号递增
/*
(r,c)棋盘左上角坐标
r----左上角行号
c----左上角列号
(tr,tc)特殊方格坐标
tr---特殊方格所在行号
tc---特殊方格所在列号
size--棋盘大小
*/
void chessboard(int r, int c, int tr, int tc, int size)
{
if(size==1) return; //棋盘大小为1,说明递归到最里层
int t = ++tile;
int s = size/2; //分割棋盘
//覆盖左上角棋盘
if(tr<r+s && tc<c+s) //特殊方格在此棋盘中
chessboard(r,c,tr,tc,s);
else
{
board[r+s-1][c+s-1] = t; //用t号骨牌覆盖此左上角棋盘的右下角,使该方块等同为特殊方块
chessboard(r,c,tr+s-1,tc+c-1,s); //覆盖其余棋盘
}
//覆盖棋盘右上角棋盘
if(tr<r+s && tc>=c+s) //特殊方格在此棋盘中
chessboard(r,c+s,tr,tc,s);
else
{
board[r+s-1][c+s] = t; //用t号骨牌覆盖此右上角棋盘的左下角,使该方块等同为特殊方块
chessboard(r,c+s,r+s-1,c+s,s); //覆盖其余棋盘
}
//覆盖左下角棋盘
if(tr>=r+s && tc<c+s) //特殊方格在此棋盘中
chessboard(r+s,c,tr,tc,s);
else
{
board[r+s][c+s-1] = t; //用t号骨牌覆盖此左下角棋盘的右上角,使该方块等同为特殊方块
chessboard(r+s,c,r+s,c+s-1,s); //覆盖其余棋盘
}
//覆盖右下角棋盘
if(tr>=r+s && tc>=c+s) //特殊方格在此棋盘中
chessboard(r+s,c+s,tr,tc,s);
else
{
board[r+s][c+s] = t; //用t号骨牌覆盖此右下角棋盘的左上角,使该方块等同为特殊方块
chessboard(r+s,c+s,r+s,c+s,s); //覆盖其余棋盘
}
}
int main()
{
int n, tr, tc;
printf("请输入棋盘规模(n*n):n= ");
scanf("%d", &n);
printf("特殊方格所在位置:");
scanf("%d", &tr);
scanf("%d", &tc);
chessboard(1, 1, tr, tc, n);
int i, j;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
printf("%d\t", board[i][j]);
printf("\n");
}
return 0;
}
棋盘覆盖
最新推荐文章于 2024-04-27 23:19:08 发布