坑挺多的,首先是n=1的情况要特殊考虑
其次是输出格式,气哭我了,它是要求除第一次外输入一行就换行,再输出,我一直是输出后再换行,很窒息
我的做法是确定中心,然后确定中间那行,根据中间那行向上、下递推
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include<string>
using namespace std;
void main()
{
int n;
char a, b;
char m[80][80];
int i, j, count = 0;
while (cin >> n >> b >> a)
{
if (count)cout << endl;
if (n == 1)
{
cout << b << endl ;
continue;
}
int c = n / 2;
//确定最中间一行
for (i = 0; i < n; i++)
{
if (i%2==c%2)
m[c][i] = b;
else m[c][i] = a;
}
//往上走,规律根据中间那行向上递推
for (i = c-1; i >=0; i--)
for (j = 0; j < n ; j++)
{
if (j > i&&j < n - i - 1)
{
if (m[i +1][j] == a)
m[i][j] = b;
else m[i][j] = a;
}
else m[i][j] = m[i + 1][j];
}
m[0][0] = ' ';
m[0][n - 1] = ' ';
//向下遍历
for (i = n / 2 + 1; i < n; i++)
for (j = 0; j < n; j++)
m[i][j] = m[n - i - 1][j];
for (i = 0; i < n; i++){
for (j = 0; j < n; j++)
{
cout << m[i][j];
}
cout << endl;
}
count++;
}
}