C#打印内嵌套的空心菱形

样式:
· 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;
}
}

上述两种方法运行结果都一样:
这里写图片描述

如果还有其他方法,欢迎指出!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值