分治--棋盘覆盖

 

题目描述

 

在一个2^k×2^k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

 

 

输入要求

 

输入一个整数k,k<=5;

输入特殊格子的坐标x,y。

 

 

输出要求

 

输出一个由数值表示的二维矩阵。填充规则如下:

(1)用数值填充方格;

(2)特殊方格数值为0;

(3)从中心点开始;然后左上、右上、左下、右下的计数顺序填数;同一块用相同数值表示;

(4)每个数值占4个位置空间;右对齐,左补空格。

 

 

输入样例

3
1 2

 

 

输出样例

   3    3    4    4    8    8    9    9
   3    2    0    4    8    7    7    9
   5    2    2    6   10   10    7   11
   5    5    6    6    1   10   11   11
  13   13   14    1    1   18   19   19
  13   12   14   14   18   18   17   19
  15   12   12   16   20   17   17   21
  15   15   16   16   20   20   21   21

 

 

 

#include<iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;


int Board[33][33]={0};
static int tile=0;

int cifang(int k)
{
	int result=1;
	for(int i=0;i<k;i++)
		result=result*2;
	return result;
}
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{
	if(size==1)
		return ;
	tile++;

	int t = tile,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;//不在右上角,则自己加一块
		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;
		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;
		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{
		Board[tr+s][tc+s]=t;
		ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
	}

}


int main()
{
	int k;
	while(cin>>k)
	{
		int x,y;
		cin>>x>>y;
		int i,j;

		int tr =0, tc=0;
		int size = cifang(k);
		int length  = cifang(k);

		ChessBoard(tr,tc,x,y,size);


		for(i=0;i<length;i++)
		{
			for(j=0;j<length;j++)
			{
				cout.width(3);
				printf("%4d",Board[i][j]);
				if(j==size-1){
                cout<<endl;
				}
			}
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌新待开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值