棋盘覆盖问题C++代码

 

#include<iomanip.h>
#include<iostream.h>
#include<stdlib.h>

int tile=0; //定义全局变量tile表示L型骨牌编号
int **chessarr; //定义全局变量chessarr表示棋盘数组
void chessboard(int row0,int col0,int size,int sprow,int spcol);
// 棋盘覆盖函数
// row0,col0为棋盘左上角位置,sprow,spcol为特殊方格位置
// size为棋盘规模

void chessboard(int row0,int col0,int size,int sprow,int spcol) //棋盘覆盖函数
{
if(size==1) return; //如果棋盘规模=1,返回
int s=size/2; //分割棋盘
int t=++tile; //L型骨牌编号加1

//处理左上角子棋盘
if(sprow < row0+s && spcol < col0+s)
chessboard(row0,col0,s,sprow,spcol);
else
{
chessarr[row0+s-1][col0+s-1]=t;
chessboard(row0,col0,s,row0+s-1,col0+s-1);
}

//处理右上角子棋盘
if(sprow < row0+s && spcol >= col0+s)
chessboard(row0,col0+s,s,sprow,spcol);
else
{
chessarr[row0+s-1][col0+s]=t;
chessboard(row0,col0+s,s,row0+s-1,col0+s);
}

 

//处理左下角子棋盘
if(sprow >= row0+s && spcol < col0+s)
chessboard(row0+s,col0,s,sprow,spcol);
else
{
chessarr[row0+s][col0+s-1]=t;
chessboard(row0+s,col0,s,row0+s,col0+s-1);
}
//处理右下角子棋盘
if(sprow >= row0+s && spcol >= col0+s)
chessboard(row0+s,col0+s,s,sprow,spcol);
else
{
chessarr[row0+s][col0+s]=t;
chessboard(row0+s,col0+s,s,row0+s,col0+s);
}
}

void main()
{

int k,x,y; //阶数及特殊点位置
int i,j,n; //棋盘规模为 n*n
cout<<"请输入棋盘的阶数:";

cin>>k;
cout<<"请输入特殊点的位置(从1开始):";
cin>>x>>y;

for (i=0,n=1;i<k;i++)
n*=2;

//在堆内存中建立棋盘数组,填充特殊方格
if((chessarr=new int*[n])==NULL)
{
cout << "Can't allocate more memory,terminating." << endl;
exit (1);
}
for (i=0;i<n;i++ )
{
if((chessarr[i]=new int[n])==NULL)
{
cout << "Can't allocate more memory,terminating." << endl;
exit (1);
}
}
chessarr[x-1][y-1]=0; // 填写特殊方格
tile=0;

chessboard(0,0,n,x-1,y-1);
//进行棋盘覆盖,左上角位置0,0; 棋盘宽度n; 特殊点x,y

 


for (i=0;i<n;i++)
{
for (j=0;j<n;j++ )
{

cout << setw(5) << chessarr[i][j];
}

cout << endl;
}


//释放内存
for(i=0;i<n;i++)
delete[] chessarr[i];
delete[] chessarr;

return;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值