问题 3887 --棋盘覆盖问题(完善程序)

3887: 棋盘覆盖问题(完善程序)★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 45  解决: 26
[提交][状态][命题人:]

题目描述

在一个 2^k ×2^k 个方格组成的棋盘中恰有一个方格与其他方格不同(图中标记为-1 的 方格),称之为特殊方格。现用 L 型(占 3 个小格)纸片覆盖棋盘上除特殊方格的所有部分,各纸片不得重叠,于是,用到的纸片数恰好是 (4^k-1) /3 。在下表给出的一个覆盖方案中, k=2,相同的 3 个数字构成一个纸片。

 

下面给出的程序是用分治法设计的,将棋盘一分为四,依次处理左上角、右上角、左下角、右下角,递归进行。

请将程序补充完整。

#include <iostream>
#include <iomanip>
using namespace std;
int board[65][65],tile;	// tile	为纸片编号
void chessboard(int tr,int tc,int dr,int dc,int size)// dr,dc 依次为特殊方格的行、列号
{
	int t,s;
	if (size==1)
		____(1)_____;
	t=tile++;
	s=size/ 2;
	if(_____(2)_____)
		chessboard(tr,tc,dr,dc,s);
	else 
	{
		board[tr+s-1][tc+s-1]=t;
	    _____(3)_____;
	}

	if(dr<tr+s	&&	dc>=tc+s)
		chessboard(tr,tc+s,dr,dc,s);
	else 
	{
		board[tr+s-1][tc+s]=t;
		_____(4)______;
	}
	if(dr>=tr+s	&&	dc<tc+s)
		chessboard(tr+s,tc,dr,dc,s);
	else 
	{
		board[tr+s][tc+s-1]=t;
		_____(5)______;
	}

	if(dr>=tr+s	&&	dc>=tc+s)
		chessboard(tr+s,tc+s,dr,dc,s);
	else 
	{
		board[tr+s][tc+s]=t;
		______(6)______;
	}
}
void prt1(int b[][65],int n) 
{
	int i,j;
	for(i=1; i<=n; i++) 
	{
		for(j=1; j<=n; j++)
			cout<<setw(3)<<b[i][j];
		cout<<endl;
	}
}
int main() 
{
	int size,dr,dc;
	cin>>size;
	cin>>dr>>dc;
	board[dr][dc]=-1;
	tile++;
	chessboard(1,1,dr,dc,size);
	prt1(board,size);
}


输入

输出

样例输入
Copy
4 2 2
样例输出
Copy
  2  2  3  3
  2 -1  1  3
  4  1  1  5
  4  4  5  5

提示

来源

[提交][状态]