题目
输入n(n>1,n<12),n为上半层菱形的高度
输出
根据输入的n输出*
构成空心菱形
样例输入
3
样例输出
*
* *
* *
* *
*
思路
观察发现:
第0行(从0开始计)的字符在一行的最中间;
第1行的第1个字符在中间位置-1, 第2个字符在中间位置+1;
第2行的第1个字符在中间位置-1-1, 第2个字符在中间位置+1+1;
第3行的第1个字符在中间位置-1-1+1, 第2个字符在中间位置+1+1-1;
第4行的第1个字符在中间位置-1-1+1+1, 第2个字符在中间位置+1+1-1-1;
于是, 我们可以用两个变量分别记录一行中左边字符的位置和右边字符的位置, 并将它们初始化为一行的中间位置:
int head = n+n-1, tail = n + n - 1; //n+n-1为一行的中间位置
用i表示行数(i从0开始);
-
当i < n 时, 每遍历一行, head–, tail++;
-
当i >= n时, head++, tail–;
用j表示列号(j从0开始):
- 如果j == head 或者 j == tail, 输出
*
- 否则, 输出空格
" "
;
代码
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int n1 = n + n -1; //n1表示输出的结果有n1行,n1列
int head = n-1, tail = n-1; //'*'的位置
for (int i = 0; i < n1; i++) {
for (int j = 0; j < n1; j++) {
if (j == head || j == tail) {
cout << "*";
/*输出完一行的最后一个*号后, 提前结束,
行末就不会有空格了.
有些刷题网站的判题规则:行末不能有空格,
否则会出现格式错误的问题*/
if (j == tail) {
break;
}
}
else {
cout << " ";
}
}
cout << endl; //输出完一行后换行
if (i < n-1) {
head--;
tail++;
}
else {
head++;
tail--;
}
}
return 0;
}