您的位置:首页 > 其它

棋盘覆盖问题

2016-01-17 13:48 357 查看
在一个由2^k*2^k个方格组成的棋盘中,若恰有一个方格与其他方格不同,称该方格为特殊方格,且称该棋盘为特殊棋盘。

输入

输入有多组测试例。

对每一个测试例有两行,第一行是k(1<=k<=10),第二行是特殊方格所在的位置坐标x,y(0<=x,y<1024)。

输出

边长为2^k的方阵,特殊方格的编号为0,所有L形骨牌从1开始连续编号,数据之间的间隔是Tab。

输入样例

2

0 1

输出样例

2 0 3 3

2 2 1 3

4 1 1 5

4 4 5 5

附上代码:

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;

int board[1025][1025];  //棋盘
static int tile=1;      //所有L形骨牌从1开始连续编号

//形参(tr,tc)是棋盘中左上角的方格坐标
//形参(dr,dc)是特殊方格所在的坐标
//形参size是棋盘的行数或列数
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{
if(size==1) return;      //递归边界

int t=tile++;            //L形骨牌牌号
int s=size/2;            //分割棋盘

//覆盖左上角子棋盘
if(dr<tr+s&&dc<tc+s)
//特殊方格在此棋盘中
ChessBoard(tr,tc,dr,dc,s);
else
{
//此棋盘中无特殊方格,用t号L形骨牌覆盖右下角
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
{
//此棋盘中无特殊方格,用t号L形骨牌覆盖左下角
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
{
//此棋盘中无特殊方格,用t号L形骨牌覆盖右上角
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
{
//此棋盘中无特殊方格,用t号L形骨牌覆盖左上角
board[tr+s][tc+s]=t;
//覆盖其余方格
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}

int main()
{
int k,i,j,x,y;
while(~scanf("%d",&k))
{
scanf("%d%d",&x,&y);
k=pow(2,k);
ChessBoard(0,0,x,y,k);
for(i=0; i<k; i++)
{
for(j=0; j<k; j++)
printf("%d\t",board[i][j]);
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: