BC68 X形图案题解
问题描述
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。
输入:
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
输出:
针对每行输入,输出用“*”组成的X形图案。
解题方法1:
本题的难点是‘*’和‘空格’是随着行数变化移动的,并打印了n行。
同时当输入n为偶数和奇数时,打印效果也不一样,当n为偶数时,打印到(n/2)行和
((n/2)+1)行为‘**’。而n为奇数时,打印到((n/2)+(n%2))行为‘*’。
在此我们可以采用分解问题的思想,把这个大问题看成打印两个‘三角的’问题。如下
但我们把这两个三角打印并合并起来,本问题解决了。
因为是多行多列打印,所以要用来两层for循环。
for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { } }
(1)分析右三角
因为‘*’是从左逐渐向右跑,并且每次打印‘*’时i都等于j。
所以第一个条件是if(i==j)
(2)分析左三角
这个也是比较难的,‘*’是从右向左跑,从(0,4)到(1,3)到(2,2)到(3,1)再到(4,0)
观察i和j坐标会发现(i+j=n-1)
所以第二个条件是if(i+j==n-1)
代码实现如下:
#include<stdio.h> int main() { int n = 0; while (scanf("%d", &n) != EOF) { int i = 0; int j = 0; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (i == j) printf("*"); else if (i + j == n - 1)//因为行和列是从0开始的 printf("*"); else printf(" "); } printf("\n"); } } return 0; }
解题方法2:
创建动态二维数组,并全部初始化为空格,然后在相应位置赋值为‘*’,之后并打印。
代码实现如下:
#include <stdio.h> int main() { int n; while (scanf("%d", &n) != EOF) { char** arr = (char**)malloc(n * sizeof(char*)); int k = n - 1; for (int i = 0; i < n; i++) { arr[i] = (char*)malloc(n*sizeof(char)); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if ((i == j) || (j == k)) { arr[i][j] = '*'; if (j == k) { k--; } } else { arr[i][j] = ' '; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf("%c", arr[i][j]); } printf("\n"); } free(arr); } return 0; }