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);