UVA 10230

reference link:http://tmt514-blog.logdown.com/posts/549466-divide-and-conquer-method-v-l-shaped-brick-problem

Method: Here we used the divide and conquer method. Use recursion to deal with sub-block(2^(n-1)) in a relatively large mother block(2^n).

Take a look of reference above can give you a better comprehension of this kind of problem. 


code:

#include<iostream>
#include<stdlib.h>
#include<cstring>
#include<cmath>
#include<stack>
#include<queue>
#include<algorithm>
#include <cstdio>
#define MAX(a,b) ((a)>(b)?(a):(b)) 
//#define maxfacprime 65536 // int^1/2
using namespace std;


char garden[1030][1030];
void coverl(int N, int startx, int starty, int specialx, int specialy, char c)
{
	int size = 1 << N;
	int subsize = size / 2;
	if (N == 1)
	{
		for (int i = 0; i <= 1; i++)
			for (int j = 0; j <= 1; j++)
				if (!(startx + i == specialx && starty + j == specialy))
					garden[startx + i][starty + j] = c;
		return;
	}
	int d1x = startx;
	int d2x = d1x + subsize;
	int d1y = starty;
	int d2y = d1y + subsize;

	if (specialx < d2x&&specialx >= d1x)
	{
		if (specialy < d2y&&specialy >= d1y)// in it
		{
			garden[d2x - 1][d2y] = 'e';
			garden[d2x][d2y] = 'e';
			garden[d2x][d2y - 1] = 'e';
			coverl(N-1, d1x, d2y, d2x - 1, d2y, 'a');//top right 
			coverl(N-1, d2x, d1y, d2x, d2y - 1, 'b');// bottom left
			coverl(N-1, d2x, d2y, d2x, d2y, 'c');// bottom right
			coverl(N-1, d1x, d1y, specialx, specialy, 'd');//top left
		}
		else
		{
			garden[d2x - 1][d2y - 1] = 'f';
			garden[d2x][d2y - 1] = 'f';
			garden[d2x][d2y] = 'f';
			coverl(N-1, d1x, d1y, d2x - 1, d2y - 1, 'd');//top left
			coverl(N-1, d1x, d2y, specialx, specialy, 'a');
			coverl(N -1, d2x, d1y, d2x, d2y - 1, 'b');
			coverl(N -1, d2x, d2y, d2x, d2y, 'c');
		}
	}
	else
	{
		if (specialy < d2y&&specialy >= d1y)// in it
		{
			garden[d2x - 1][d2y - 1] = 'g';
			garden[d2x - 1][d2y] = 'g';
			garden[d2x][d2y] = 'g';
			coverl(N -1, d1x, d1y, d2x - 1, d2y - 1, 'd');
			coverl(N -1, d1x, d2y, d2x - 1, d2y, 'a');
			coverl(N -1, d2x, d1y, specialx, specialy, 'b');
			coverl(N -1, d2x, d2y, d2x, d2y, 'c');
		}
		else
		{
			garden[d2x - 1][d2y - 1] = 'h';
			garden[d2x - 1][d2y] = 'h';
			garden[d2x][d2y-1] = 'h';
			coverl(N -1, d1x, d1y, d2x - 1, d2y - 1, 'd');
			coverl(N-1, d1x, d2y, d2x - 1, d2y, 'a');
			coverl(N -1, d2x, d1y, d2x, d2y-1, 'b');
			coverl(N -1, d2x, d2y, specialx, specialy, 'c');
		}
	}

}

int main()
{
	//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
	int N, x, y;
	while (cin >> N >> y >> x)
	{

	//	char garden[1030][1030] = { '0' };
		int width = 1 << N;
		for (int i = 0; i <= width+1; i++)
		{
			for (int j = 0; j <= width + 1; j++)
				garden[i][j] = '0';
		}

		garden[x][y] = '*';

		coverl(N, 1, 1, x, y, 'a');
		for (int i = 1; i <= width; i++)
		{
			for (int j = 1; j <= width; j++)
				cout << garden[i][j];
			cout << endl;
		}
		cout << endl;
	}


	return 0;
}

//remember to use %lf to print double

//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值