• 题目描述
    给你一个整数n,输出n∗n的蛇形矩阵。

  • 输入描述:
    输入一行,包含一个整数n

  • 输出描述:
    输出n行,每行包含n个正整数,通过空格分隔。1<=n<=1000

  • 示例1
    输入:4
    输出:
    1 2 6 7
    3 5 8 13
    4 9 12 14
    10 11 15 16

  • 解题思路:
    回型矩阵 类似,都是需要先创建数组进行处理,然后再逐行输出数组内容。而本题的处理方式比回型矩阵 复杂一点。但还是有规律可循。所谓蛇形,从示例中可以看出,就是数组中数字的递增方式像蜿蜒爬行的蛇一样。从1开始,蜿蜒到16,并且如下图所示,如果以右斜向上来看,红色划线的数字在所在的红线上右斜向上递增,而从左斜向下看,绿色划线的数字所在的绿线上左斜向下递增,并且细看还发现,红线所在的斜列长度是奇数,而绿线所在的斜列是偶数,因此再集中分析边界条件可得到相应的代码。

  • C# 代码
    using System;
    class Program{
      static void Main(){
          string input;
          while((input = Console.ReadLine()) != null){
              int n = int.Parse(input);
              int[][] arr = new int[n][];
              for(int p = 0; p < n; p++) arr[p] = new int[n];
              bool decrease = false;
              int i = 0, j = 0, k = 1, len = 1;
              while(k <= n*n){
                  for(int l = 0; l < len; l++){
                      arr[i][j] = k++;
                      if(len%2 == 1){
                          if(j < n-1){
                              i = i > 0 ? i-1 : i;
                              j++;
                          }
                          else i++;
                      }
                      else{
                          if(i < n-1){
                              j = j > 0 ? j-1 : j;
                              i++;
                          }
                          else j++;
                      }
                  }
                  if(len == n) decrease = true;
                  if(decrease) len--;
                  else len++;
              }
              for(int p = 0; p < n; p++){
                  for(int q = 0; q < n; q++) Console.Write(arr[p][q] + " ");
                  Console.WriteLine();
              }
          }
      }
    }