바둑판 덮어쓰기 문제 (귀속 + 분할)

1317 단어 역귀+분배
나누어 바둑판을 네 조각으로 나누어 나눌 수 있으면 나누어 마지막에 검은 조각이 남을 때까지 되돌려준다.왼쪽 상단을 예로 들면 검은 덩어리가 왼쪽 위에 있으면 귀속된다.만약 검은 덩어리가 왼쪽 위에 있지 않으면 L을 채워서 검은 덩어리라고 가정하고 채워진 위치는 덩어리가 나뉘기 전의 큰 바둑판의 중간이며 검은 덩어리의 일부분을 포함하지 않고 나머지 세 부분은 L을 채워서 그들이 하나의 값과 같게 한다.그리고 다시 돌려보내기;
#include
using namespace std;

const int maxn = 8;
int tile = 1;
int board[maxn][maxn];

void ChessBoard(int tr, int tc, int dr, int dc, int size)
{
	if(size == 1) return;
	int t = tile++;
	int 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);
	} 
}

void print()
{
	cout.setf(ios::left);
	for(int i = 0; i < maxn; i++)
	{
		for(int j = 0; j < maxn; j++)
		{
			cout.width(3);
			cout<

좋은 웹페이지 즐겨찾기