几何法

依据到中心点的层数来选择输出的元素

#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;
}