2021-09-14

对一个行列数皆为2的n次方且中间有一空缺的棋盘进行填充

#include<bits/stdc++.h>
using namespace std;
int **Board;
int tile=1; //(0 by default)
void ChessBoard(int tr, int tc, int dr, int dc, int size)
{
    //tr:棋盘左上角方格的行号  tc:棋盘左上角方格列号
    //dr:特殊方格所在的行号    dc:特殊方格所在的列号
    //size:棋盘的行数或列数
    if(size==1) 
    {
        cout<<"size==1,return!"<<endl;
        return;
    }
    int t = tile++, //骨牌编号,每次加1,同意骨牌又通过一边好,特殊方格标号为0
    s = size/2;     //象限大小,即分割棋盘,每次规格减半

    //覆盖左上象限
    if(dr<tr+s && dc<tc+s)
        ChessBoard(tr, tc, dr, dc, s);  //特殊方格位于本象限
    else 
    {
        //本象限中没有特殊方格
        Board[tr+s-1][tc+s-1] = t;  //把三格板t放在右下角,将此象限转化为特殊棋盘
        cout<<"此时t:"<<t<<" 填充格坐标位于:("<<tr+s-1<<","<<tc+s-1<<")"<<endl;
        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;
        cout<<"此时t:"<<t<<" 填充格坐标位于:("<<tr+s-1<<","<<tc+s<<")"<<endl;
        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;
        cout<<"此时t:"<<t<<" 填充格坐标位于:("<<tr+s<<","<<tc+s-1<<")"<<endl;
        ChessBoard(tr+s, tc, tr+s, tc+s-1, s);  
    }
    // 覆盖右下象限
    if(dr>=tr+s && dr>=tc+s)
        ChessBoard(tr+s, tc+s, dr, dc, s);
    else
    {
        Board[tr+s][tc+s] = t;
        cout<<"此时t:"<<t<<" 填充格坐标位于:("<<tr+s<<","<<tc+s<<")"<<endl;
        ChessBoard(tr+s, tc+s, tr+s, tc+s, s);
    }
}
void OutputBoard(int size)
{
    for(int i=0; i<size; ++i)
    {
        for(int j=0; j<size; ++j)
        {
            cout.width(5);
            cout<<Board[i][j];
        }
        cout<<endl;
    }
}

int main()
{
    // size:棋盘的行数或列数
    int size, i;
    cout<<"Lines or Columns of chessBoard: ";
    cin>>size;
    Board = new int*[size];
    for(i=0; i<size; ++i)
    {
        Board[i] = new int[size];
        for(int j=0; j<size; ++j)
            Board[i][j] = 0;
    }

    //dr, dc:特殊方格所在的行号和列号
    int dr, dc;
    cout<<"Line and column NO. of defective grid: ";
    cin>>dr>>dc;
    ChessBoard(0, 0, dr, dc, size);
    OutputBoard(size);
    for(int i=0; i<size; ++i)
        delete[] Board[i];
    delete[] Board;
    system("pause");
    return 0;
}
==这个程序主要运用了深度递归,具体方式不好理解,可以通过运行的输出结果对整个过程有一个好的了解==


wchart.js/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值