上链接:P1498 南蛮图腾 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
上题干:
给定一个正整数 n,参考输出样例,输出图形。
输入格式
每个数据输入一个正整数 n,表示图腾的大小(此大小非彼大小)
输出格式
这个大小的图腾
输入 :2
输出 :
/\
/__\
/\ /\
/__\/__\
输入 :3
输出 2
/\
/__\
/\ /\
/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\/__\/__\数据保证,1<= n <= 10。
这个图形的最小单元是:
/\
/__\
当我们将它向右翻一次
得到这样的图像:
/\ /\
/__\/__\
当我们将最小单元再向上翻一次:
得到这样的图像:
/\
/__\
/\ /\
/__\/__\
这就是n=2时候的图像。
那么要求n=3的时候的图像,我们就要以n=2时候的图像为最小单元:
最小单元:
/\
/__\
/\ /\
/__\/__\
向右翻一次:
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\/__\/__\
向上翻一次:
/\
/__\
/\ /\
/__\/__\
/\ /\
/__\ /__\
/\ /\ /\ /\
/__\/__\/__\/__\
通过n=2,n=3的图像的形成,我们可以得到一个思路。
从n=1的基本单元开始递推,模拟向右翻和向上翻的过程,得到n=2的图像。
以n=2的图像为基本单元,再次进行模拟操作,得到n=3的图像。
以n=3的图像为基本单元.......
我们很容易可以发现,这是一个不断调用(模拟向右翻和向上翻)函数的过程。
但是我们是以char数组来实现这一个步骤的,而不断向上翻,可能会出现数组越界的情况。
所以我们选择将最小单元改变成这样:
i=1 /\ ————> /__\
i=2 /__\ ————> /\
在我们输出的时候将行倒过来输出就行了。
先输出i=2,再输出i=1
i=2: /\
i=1 : /__\
欧克:上代码:
char a[1024][2048];
void copy1(int len)
{
for (int i = 0; i < len / 2; i++)
for (int j = 0; j < len; j++)
{
a[i][j + len] = a[i][j]; //右复制
a[i + len / 2][j + len / 2] = a[i][j]; //下复制
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < 1024; i++)
for (int j = 0; j < 1024; j++)
a[i][j] = ' '; 先把表格都赋值为空格,这样可以占位
int len = 4; len代表基本单元的列宽,len/2代表行宽
a[0][0] = a[1][1] = '/'; 创建n=1的时候的最小单元
a[0][1] = a[0][2] = '_';
a[0][3] = a[1][2] = '\\';
for (int i = 2; i <= n+1; i++)
{
len=pow(2,i); 不断更新 最小单元
copy1(len);
}
for (int i = len/2-1; i >= 0; i--) {
for (int j = 0; j <= len-1; j++)
cout << a[i][j];
cout << endl;
}
}