几何法
依据到中心点的层数来选择输出的元素
#include <iostream>
#include <algorithm>
using namespace std;
int n;
char center, outer;
int main() {
while (cin >> n >> center >> outer) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 四个角
if (n != 1 && (
(i == 0 && j == 0) ||
(i == 0 && j == n - 1) ||
(i == n - 1 && j == 0) ||
(i == n - 1 && j == n - 1)))
cout << ' ';
else {
// 求所在圈号(由里到外,0开始编号)
int mid = n >> 1;
int layer = max(abs(i - mid), abs(j - mid));
// 偶数圈号输出中心字符,奇数圈号输出外圈字符
if (layer % 2 == 0) cout << center;
else cout << outer;
}
}
cout << endl;
}
cout << endl;
}
return 0;
}
分块模拟
由外往里,一次画一条边:
while (还有圈) {
画上边
画右边
画下边
画左边
缩圈
换字符
}
#include <iostream>
using namespace std;
int n;
char center, outer;
const int N = 85;
char a[N][N];
int main() {
while (cin >> n >> center >> outer) {
int top = 0, bottom = n - 1;
int left = 0, right = n - 1;
// 偶数个圈,最外圈是中心字符
if ((n / 2) % 2 == 0) swap(center, outer);
while (top <= bottom && left <= right) {
// 画上边
for (int i = left; i <= right; i++)
a[top][i] = outer;
// 画右边
for (int i = top + 1; i <= bottom; i++)
a[i][right] = outer;
// 画下边
for (int i = right - 1; i >= left; i--)
a[bottom][i] = outer;
// 画左边
for (int i = bottom - 1; i > top; i--)
a[i][left] = outer;
// 缩圈
top++, bottom--;
left++, right--;
// 换字符
swap(outer, center);
}
// 磨掉四个角(仅有一个元素除外)
if (n != 1)
a[0][0] = a[0][n - 1] = a[n - 1][0] = a[n - 1][n - 1] = ' ';
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
cout << a[i][j];
cout << endl;
}
cout << endl;
}
return 0;
}

京公网安备 11010502036488号