# 13689 - Doracarpet
>author: Utin
###### tags: `recursion`
---
## Brief
See the code below
## Solution 0
```c=
#include <stdio.h>
char table[5][5];
char ans[10001][10001];
void initialize(); //初始化1的情況並存在table
void f0(int size, int index_i, int index_j, int range); //若size是偶數
void f1(int size, int index_i, int index_j, int range); //若size是奇數
int power(int a); //2的a次方
void k0(int range, int index_i, int index_j); //全空
void k1(int range, int index_i, int index_j); //缺右上
void k2(int range, int index_i, int index_j); //缺左上
void k3(int range, int index_i, int index_j); //缺左下
void k4(int range, int index_i, int index_j); //缺右下
int main() {
initialize();
int n;
scanf("%d", &n);
int range = power(n+1); //range為圖的寬度
if (n%2 == 0) f0(n, 0, 0, range);
else f1(n, 0, 0, range);
//輸出
for (int i=0; i<range; i++) {
for (int j=0; j<range; j++) {
printf("%c", ans[i][j]);
}
printf("\n");
}
}
void initialize() {
for (int i=0; i<4; i++) {
for (int j=0; j<4; j++) {
if ((i == 0 || i == 3) && (j == 0 || j == 3)) table[i][j] = '.';
else table[i][j] = '#';
}
}
}
void f0(int size, int index_i, int index_j, int range) {
f1(size-1, index_i, index_j, range/2);
for (int i=index_i; i<index_i+range/2; i++) {
for (int j=index_j; j<index_j+range/2; j++) {
ans[i+range/2][j] = ans[i][j];
ans[i][j+range/2] = ans[i][j];
ans[i+range/2][j+range/2] = ans[i][j];
}
}
}
void f1(int size, int index_i, int index_j, int range) {
if (size == 1) {
for (int i=index_i; i<index_i+4; i++) {
for (int j=index_j; j<index_j+4; j++) {
ans[i][j] = table[i-index_i][j-index_j];
}
}
}
else {
f0(size-1, index_i+range/4, index_j+range/4, range/2);
k0(range/4, index_i, index_j);
k1(range/4, index_i, index_j+range/4);
k2(range/4, index_i, index_j+2*range/4);
k0(range/4, index_i, index_j+3*range/4);
k3(range/4, index_i+range/4, index_j);
k4(range/4, index_i+range/4, index_j+3*range/4);
k2(range/4, index_i+2*range/4, index_j);
k1(range/4, index_i+2*range/4, index_j+3*range/4);
k0(range/4, index_i+3*range/4, index_j);
k4(range/4, index_i+3*range/4, index_j+range/4);
k3(range/4, index_i+3*range/4, index_j+2*range/4);
k0(range/4, index_i+3*range/4, index_j+3*range/4);
}
}
int power(int a) {
if(a > 0) return 2 * power(a-1);
else return 1;
}
void k0(int range, int index_i, int index_j) {
for(int i = index_i; i < index_i + range; i++) {
for(int j = index_j; j < index_j + range; j++) {
ans[i][j] = '.';
}
}
}
void k1(int range, int index_i, int index_j) {
for(int i = index_i; i < index_i + range; i++) {
for(int j = index_j; j < index_j + range; j++) {
if(i < index_i+range/2 && j >= index_j+range/2) ans[i][j] = '.';
else ans[i][j] = '#';
}
}
}
void k2(int range, int index_i, int index_j) {
for(int i=index_i; i<index_i+range; i++) {
for(int j=index_j; j<index_j+range; j++) {
if(i < index_i+range/2 && j < index_j+range/2) ans[i][j] = '.';
else ans[i][j] = '#';
}
}
}
void k3(int range, int index_i, int index_j) {
for(int i=index_i; i<index_i+range; i++) {
for(int j=index_j; j<index_j+range; j++) {
if(i >= index_i+range/2 && j < index_j+range/2) ans[i][j] = '.';
else ans[i][j] = '#';
}
}
}
void k4(int range, int index_i, int index_j) {
for(int i=index_i; i<index_i+range; i++) {
for(int j=index_j; j<index_j+range; j++) {
if(i >= index_i+range/2 && j >= index_j+range/2) ans[i][j] = '.';
else ans[i][j] = '#';
}
}
}
// By Utin
```
## Reference