暴力解决
每次把已打出的所有图形往下复制两次
出来的图形都挤在左侧
再按规律在前补空格即可
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 5002;
char ans[MAXN][MAXN];
int prefix[MAXN];
int outl[MAXN];
string mode[3];
int main()
{
memset(ans, ' ', sizeof(ans));
mode[0] = " /\\ ";
mode[1] = "/__\\";
mode[2] = " ";
for(int i = 0; i < mode[0].length(); i++)
{
ans[0][i] = mode[0][i];
ans[1][i] = mode[1][i];
}
int N;
cin>>N;
N--;
int th = 2, tw = 4;
for(int m = 0; m < N; m++)
{
for(int pnr = th, i = 0; pnr < th + th; pnr++, i++)
{
for(int pnc = 0, j = 0; pnc < tw; pnc++, j++)
{
ans[pnr][pnc] = ans[i][j];
}
}
for(int pnr = th, i = 0; pnr < th + th; pnr++, i++)
{
for(int pnc = tw, j = 0; pnc < tw + tw; pnc++, j++)
{
ans[pnr][pnc] = ans[i][j];
}
}
th *= 2;
tw *= 2;
}
int mlen = pow(2, N + 1);
mlen -= 2;
if(N == 0)
mlen = 0;
prefix[0] = mlen;
for(int i = 1; ;i++)
{
if(i % 2 == 1)
prefix[i] = prefix[i - 1];
else
prefix[i] = prefix[i - 1] - 2;
if(prefix[i] == 0)
break;
}
outl[0] = 3;
for(int i = 1; i < 1500; i++)
{
outl[i] = (i + 1) * 2 + 1;
}
for(int i = 0; i < th; i++)
{
for(int k = 0; k < prefix[i]; k++)
cout<<' ';
for(int j = 0; j < outl[i]; j++)
{
//if(ans[i][j] != ' ')
cout<<ans[i][j];
}
cout<<endl;
}
//cout<<tw<<endl;
return 0;
}