打印数字回环

题目要求:

Input a value n, then print out a n×n matrix.

    Example 1: Input 2, output
1 2
4 3
    Example2: Input 5, output
  1    2    3    4    5
 16   17   18   19    6
 15   24   25   20    7
 14   23   22   21    8
 13   12   11   10    9


思路:

把该输出划分为多个环,每一个环上有4根线。分别为0,1,2,3号。

最外层的环每根线上有n-1个数字,每靠内一层。线上数字少2个。

计算每一个位置(row, col)相应的环、线、线内索引。进而求出环内索引和全局索引。在该位置打印全局索引就可以。


代码例如以下:

#include   <algorithm>
using   namespace   std;

int  get_number( int   row,  int  col,  int  n)
{
           int  n_1 = n - 1;
           int  loop1 = min(row, col);
           int  loop2 = min(n_1-row, n_1-col);
           int  loop = min(loop1, loop2);
           int  line, index_in_line;
           if  (col == loop && row != loop)
        {
                line = 3;
                index_in_line = (n_1-loop) - row;
        }
           else   if   (n_1-row == loop)
        {
                line = 2;
                index_in_line = (n_1-loop) - col;
        }
           else   if   (n_1-col == loop)
        {
                line = 1;
                index_in_line = row - loop;
        }
           else   if   (row == loop)
        {
                line = 0;
                index_in_line = col - loop;
        }
           int  line_length = n_1 - loop * 2;
           int  index_in_loop = line * line_length + index_in_line;
           int  before_loop = 4 * (n_1 - loop + 1) * loop;
           return  before_loop + index_in_loop + 1;
}

void   print_square( int   n)
{
           for ( int   row=0; row<n; ++row)
        {
                   for ( int   col=0; col<n; ++col)
                {
                           int   number = get_number(row, col, n);
                        printf(   "%4d " , number);
                }
                printf(   "\n" );
        }
}

int   main () {
           for ( int   i=1; i<10; ++i)
        {
                print_square(i);
                printf(   "\n" );
        }
           return   0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值