棋盘覆盖

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值