北电 面试题!

3 ,打印一个 N*N 的方阵, N 为每边字符的个数( 3 N 20 ),要求最外层为 "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

 同志们,找规律!先分成几部分,再从这几部分中找规律。这题很有意思,同志们多在纸上先画一画。

废话不多少,直接上我的代码,同志们可以参考一下,注释我写的很清楚!

#include <stdio.h>

int main()
{
    int N = 12;//层数 即 NxN的方阵
//    scanf("%d",&N);

    int num;//一行或者一列的中心位置
    num = (N + 1) / 2; //由于打印出来的图像是对称的,num 就当作 中心位置


    //从第一层开始遍历 
    for(int i=1; i<=N; i++)
    {
  
        

            //如果是第一层 或者最后一层 那么打印一行 X 就行
            if( (i == 1) || (i == N))
            {
                for(int k=1; k<=N; k++)
                {
                    printf("X  ");
                }
            }
            //如果是第2层或者倒数第二层 
            else if( ( i == 2 ) || ( i == N-1))
            {
                //遍历这一层 从左到右每个位置上的元素
                for(int k=1; k<=N; k++)
                {
                    //如果是第一个元素或者最后一个元素 就打印X
                    if((k == 1) || (k == N))
                    {
                        printf("X  ");
                        continue;;
                    }
                    else
                    //否则打印Y
                    printf("Y  ");
                }   
                
            }
            else//从第3层开始,同理,打印的图像是上下对称图像, 那么 每一行的元素 对中心轴 会有相同的一行
            {
                int x = i;//x = 第几层
                if(x > num)//如果层数大于中心轴,那么就用数学关系 将层数 置为 与其轴对称 的层数
                {
                    x = N-x+1; //例如 N = 10, x = 7,那么与第7层有轴对称关系的是第4层
                }
                //从左到右 遍历这一层上的每一个 位置上的元素
                for(int k=1; k<=N; k++)
                {
                   
                    int t = k;//k:记录是第几个位置上的元素
                    if((t == 1) || (t == N))//第一个位置和最后一个位置 都打印X
                    {
                        printf("X  ");
                    }
                    else if((t == 2) || (t == N-1))//第二个位置和倒数第二个位置 都打印Y
                    {
                        printf("Y  ");
                    }
                    else //其他位置
                    {
                        // 同理 每一行的元素 也会有轴对称 的元素

                        if(k > num)//如果元素位置 大于中心轴
                        {
                            //每一行的元素最大是 x-3
                            int tmp = (N-t+1)-3; //输出的就和 中心轴 另一半一样
                            if(tmp > x - 3) //如果超过
                            {
                                tmp = x - 3;//就置为x-3
                                printf("%d  ",tmp);
                            }
                            else
                            {
                                printf("%d  ",tmp); //打印(N-t+1)-3
                            }
                            
                        } 
                        else
                        {
                            if(k > x)
                            {
                                //最大只能是t-3
                                t = x;
                                printf("%d  ",t-3);
                            }
                            else
                            {
                                printf("%d  ",t-3);
                            }

                           
                        }
                    }
                    
                }
            }
            

        
        printf("\n");

    }
}

   


贴个我的运行截图吧

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值