问题描述
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..
输入:一个正整数 n (n< 30) 表示要求打印图形的层数。
解题方案
代码
#include <iostream>
#include <string.h>
using namespace std;
int main() {
//由图可知 上下顶左右边为n*4+1
//30*4+1 +4
char arr[125][125];
int n;
scanf("%d", &n);
memset(arr, '.', sizeof(arr));
for (int i = 0; i < n; ++i) {
int top = i * 2;
for (int i = top; i < n * 4 + 5 - top; i++) {
//顶层 && 底层 && 侧边
if (i >= 2 + top && i < n * 4 + 3 - top) {
arr[top][i] = '$'; //底层
arr[n * 4 + 4 - top][i] = '$'; //底层
arr[i][top] = '$';
arr[i][n * 4 + 4 - top] = '$';
}
//第二层 && 倒数第二层
if (i == 2 + top || i == n * 4 + 2 - top) {
arr[top + 1][i] = '$'; //第二层
arr[1 + n * 4 + 2 - top][i] = '$'; //倒数第二层
}
//第三层 && 倒数第三层
if (i <= 2 + top || i >= n * 4 + 2 - top) {
arr[top + 2][i] = '$'; //第三层
arr[2 + n * 4 - top][i] = '$'; //倒数第三层
}
}
}
//十字架
if (n % 2) {
int n2 = (n * 4 + 5) / 2;
arr[n2][n2] = '$';
arr[n2][n2 - 1] = '$';
arr[n2][n2 - 2] = '$';
arr[n2][n2 + 1] = '$';
arr[n2][n2 + 2] = '$';
arr[n2][n2] = '$';
arr[n2 - 1][n2] = '$';
arr[n2 - 2][n2] = '$';
arr[n2 + 1][n2] = '$';
arr[n2 + 2][n2] = '$';
}
//打印输出
for (int i = 0; i < n * 4 + 5; ++i) {
for (int j = 0; j < n * 4 + 5; ++j) {
cout << arr[i][j] << " ";
}
cout << endl;
}
return 0;
}