问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
输入格式
一个正整数 n (n<30) 表示要求打印图形的层数。
输出格式
对应包围层数的该标志。
样例输入1
1
样例输出1
样例输入2
3
样例输出2
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。
分析如下:
左边图是输入3时的结果,右边是输入1时的结果,之前曾经想要不要用地递归,查了一下发现没有必要,把图形分成四块,每块又分成三个部分,开个字符数组赋值输出就可以了,很简单
1 #include<stdio.h> 2 #include<string.h> 3 int main(void){ 4 char a[130][130]; 5 int n, i, j, m; 6 int mid_of_row; 7 memset( a, '$', 116900 * sizeof(char)); 8 //这里是一个投机取巧的办法,直接全都赋值成$,之后找'.'的位置就可以了,这也是我写完了以后才想到的 9 scanf("%d", &n); 10 11 mid_of_row = 5 + ( n - 1) * 2;//中线位置 12 for( j = 1; j <= 22 * n + 1 ; j++){ 13 for( i = mid_of_row ; i > j + 1; i--){ 14 if( j % 2 == 0){ 15 // 上三角 16 a[j][i] = '.'; 17 // 下三角 18 a[i][j] = '.'; 19 } 20 } 21 } 22 23 // 中间 24 for( i = mid_of_row - 1; i >= 1; i--){ 25 if( i == 1){ 26 a[i][i] = '.'; 27 } 28 else if( i % 2 == 0){ 29 a[i][i] = a[i-1][i] = a[i][i-1] = '.'; 30 } 31 } 32 33 for( i = 1; i <= mid_of_row; i++){ 34 //左上 35 for( j = 1; j <= mid_of_row; j++){ 36 printf("%c", a[i][j]); 37 } 38 //右上 39 for( j = mid_of_row - 1; j >= 1; j--){ 40 printf("%c", a[i][j]); 41 } 42 printf(" "); 43 } 44 for( i = mid_of_row - 1; i >= 1; i--){ 45 // 左下 46 for( j = 1; j <= mid_of_row; j++){ 47 printf("%c", a[i][j]); 48 } 49 // 右下 50 for( j = mid_of_row - 1; j >= 1; j--){ 51 printf("%c", a[i][j]); 52 } 53 printf(" "); 54 } 55 return 0; 56 }
这种字符形状输出的问题吧,我见过的通常不难,就是麻烦了点,打出来以后特别有成就感
===================================UPDATE===============================
貌似数组初始化成'.' 然后用这种方法赋值可能更简单