样式:
· 123456789
1 0000A0000
2 000A0A000
3 00A0A0A00
4 0A0A0A0A0
5 A0A0A0A0A
6 0A0A0A0A0
7 00A0A0A00
8 000A0A000
9 0000A0000
方法一:
分析:
根据中线对称的思想,通过中心列将该图形分为两边
如果该行是奇数行,则中心列有一个A,然后是0,然后是A,0和A交替
如果是偶数行,则中心列为0,然后两边0和A交替
中间行 = (总行数 + 1) / 2
中间列 = (总列数 + 1) / 2
差值 = 行数 - 中间行 差值用来求该行有多少个A
每行A的数量 = 差值 > 0 ? 中间行 - 差值 : 行数
每行A排列:(左右对称)
奇数行:
除去中间行外左右两边的A的数量 = (当前行A的数量-1) / 2
A的位置:中间列, for 除去中间行外左右两边的A的数量 => (中间列+-2)
偶数行:
除去中间行外左右两边的A的数量 = 当前行A的数量 / 2
A的位置:for 除去中间行外左右两边的A的数量 => (中间列+-1)+-2
static void Main(string[] args)
{
while (Int32.TryParse(Console.ReadLine(), out int n))
{
//定义一个二维数组存储
char[,] ary = new char[n, n];
//中间行
int midRow = (n + 1) / 2;
//中间列
int midCol = (n + 1) / 2;
//差值,每行A的数量,
int rowDif, rowA, rowALeft;
//初始化数组
for (int row = 1; row <= n; row++)
{
for (int col = 1; col <= n; col++)
{
ary[row - 1, col - 1] = '0';
}
//计算差值,行数减去中间行
rowDif = row - midRow;
//计算每行A的数量
rowA = rowDif > 0 ? midRow - rowDif : row;
//改行左边A的数量
rowALeft = row % 2 == 0 ? rowA / 2 : (rowA - 1) / 2;
//左半边A的位置
int rowIsALeft;
//右半边A的位置
int rowIsARight;
//偶数行
if (row % 2 == 0)
{
rowIsALeft = midCol - 1;
rowIsARight = midCol + 1;
for (int i = 0; i < rowALeft; i++)
{
ary[row - 1, rowIsARight - 1] = 'A';
ary[row - 1, rowIsALeft - 1] = 'A';
rowIsARight += 2;
rowIsALeft -= 2;
}
}
//奇数行
else
{
rowIsALeft = midCol;
rowIsARight = midCol;
ary[row - 1, midRow - 1] = 'A';
for (int i = 0; i < rowALeft; i++)
{
rowIsARight += 2;
rowIsALeft -= 2;
ary[row - 1, rowIsARight - 1] = 'A';
ary[row - 1, rowIsALeft - 1] = 'A';
}
}
}
//打印菱形
for (int i = 0; i < ary.GetLength(0); i++)
{
for (int j = 0; j < ary.GetLength(1); j++)
{
Console.Write(ary[i, j]);
}
Console.WriteLine();
}
}
}
方法二
分析:
利用递归的思想,先打印最外层的菱形,然后递归打印中间的菱形
static void Main()
{
MyPrint(9);
}
//打印嵌套的空心菱形
public static void MyPrint(int n)
{
//创建二维数组
string[,] arr = new string[n, n];
//初始化二维数组
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
arr[i, j] = "0";
}
}
PrintXing(arr,n, 1, (n + 1) / 2);
//打印二维数组
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write(arr[i, j]);
}
Console.WriteLine();
}
}
//arr二维数组,n 行和列的最大值,start 开始打印的行和列数,mid 中间列
public static void PrintXing(string[,]arr,int n,int start,int mid)
{
//打印菱形的最低要求为3*3
if (n >= 3)
{
for (int i = start; i <= n; i++)
{
for (int j = start; j <= n; j++)
{
//当满足条件时,将数组中对应得元素改为A
if (Math.Abs(i - j) == mid - start || i + j == mid + start || i + j == n + mid)
{
arr[i - 1, j - 1] = "A";
}
}
}
//每层菱形的开始打印行和最大行相差2,而中间列则不变
PrintXing(arr,n - 2, start + 2,mid);
}
else
return;
}
}
上述两种方法运行结果都一样:
如果还有其他方法,欢迎指出!