打印一个N*N的方阵,N为每边字符的个数,要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,...

打印一个N*N的方阵,N为每边字符的个数,要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,...
例子:当N =5,打印出下面的图形:
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X

X X X X X

用c#写

核心就一句话“textBox1.Text += data[Math.Min(Math.Min(i, (n - 1 - i)), Math.Min(j, (n - 1 - j)))];”

private void button1_Click(object sender, EventArgs e)
        {
           textBox1.Text = "";//由于是用C#写的,所以这里是清空字符框
            int n = Convert.ToInt16(textBox2.Text);//获取需要打印的层数
            char[] data = { 'x', 'y', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };//设置需要打印的字符
            for (int i = 0; i < n; i++)//列向递增
            {
                for (int j = 0; j < n; j++)//行向递增
                {
                    textBox1.Text += data[Math.Min(Math.Min(i, (n - 1 - i)), Math.Min(j, (n - 1 - j)))];
                    //核心的循环语句,嵌套了两层最小选择,
                    //当i递增时,Math.Min(i, (n - 1 - i))的输出是0,1,2..n/2,n/2-1,n/2-2...2,1,0
                    //当j递增时,Math.Min(j, (n - 1 - j))的输出是0,1,2..n/2,n/2-1,n/2-2...2,1,0
                    //然后在把它们两个套一起,选最小,就会得到一下结果
                    //第一行最小就一直是0
                    //第二行i是1,j会一直变化,因为是选最小,所以只有第一个数和最后一个数j=0的时候选j,其它时候都是i最小,得到结果是:0,1,1...1,1,0
                    //以此类推
                }
                textBox1.Text += "\r\n";//打印完一行后,换行
            }
        }

这里面的textBox1.Text就相当于要打印的输出,只不过我这边是用C#写的,

textBox1.Text += data[Math.Min(Math.Min(i, (n - 1 - i)), Math.Min(j, (n - 1 - j)))];

也可以写成printf("%c",data[Math.Min(Math.Min(i, (n - 1 - i)), Math.Min(j, (n - 1 - j)))]);

数组data是要打印的符号,n是符号的数量,程序里面有两个嵌套的循环,相当于执行这个打印语句n*n次

如果不是用C#编程,或者没有相应的库,可以加入下面这个宏定义,选择最小值
#define _min(a,b) (((a) < (b)) ? (a) : (b))

然后Math.Min换为_min

用c写

#define _min(a,b) (((a) < (b)) ? (a) : (b)) //选择最小数的宏

void main (void)
{
    n=10;//想打印的层数
    char[] data = { 'x', 'y', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g' , 'h' };//设置需要打印的字符
    for (int i = 0; i < n; i++)//列向递增
    {
        for (int j = 0; j < n; j++)//行向递增
        {
            printf("%c",data[_min(_min(i, (n - 1 - i)), _min(j, (n - 1 - j)))]);
                    //核心的循环语句,嵌套了两层最小选择,
                    //当i递增时,_min(i, (n - 1 - i))的输出是0,1,2..n/2,n/2-1,n/2-2...2,1,0
                    //当j递增时,_min(j, (n - 1 - j))的输出是0,1,2..n/2,n/2-1,n/2-2...2,1,0
                    //然后在把它们两个套一起,选最小,就会得到一下结果
                    //第一行最小就一直是0
                    //第二行i是1,j会一直变化,因为是选最小,所以只有第一个数和最后一个数j=0的时候选j,其它时候都是i最小,得到结果是:0,1,1...1,1,0
                    //以此类推
        }
        printf("\n");//打印完一行后,换行
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值