zoukankan      html  css  js  c++  java
  • 控制台输出螺旋型数字

    看到园子里有人在讨论这个问题:
    http://www.cnblogs.com/Chinese-xu/archive/2010/03/14/1685741.html
    http://www.cnblogs.com/hanyulcf/archive/2010/03/11/1683098.html

    于是乎一时手痒,便自己也写了一个,基本原理如下:

    1. 用一个类似贪吃蛇的方式填充,以左->下->右->上的方向完成一轮填充外围一圈
    2. 进入内圈,继续以左->下->右->上的方向的方式填充,然后这样一圈圈的填充,直至填满位置。

    1

    2

    3

    4

    12

    13

    14

    5

    11

    16

    15

    6

    10

    9

    8

    7

    1

    2

    3

    4

    5

    16

    17

    18

    19

    6

    15

    24

    25

    20

    7

    14

    13

    22

    21

    8

    13

    12

    11

    10

    9

      

    static void Main(string[] args)
    {
        while (true)
        {
            int length = int.Parse(Console.ReadLine());
            var data = new int[length, length];

            Process(data, 1, 0, 0, length);

            //
    在控制台上输出
            for (int i = 0; i < length; i++)
            {
                for (int j = 0; j < length; j++)
                {
                    Console.Write(data[i, j].ToString().PadRight(3));
                }
                Console.WriteLine();
            }
        }
    }

    static void Process(int[,] data, int startIndex, int startX, int startY, int length)
    {
        if (length <= 0)    //
    两种特殊的数据,无需前进,直接出结果
        {
            return;
        }
        else if (length == 1)
        {
            data[startX, startY] = startIndex++;
            return;
        }

        for (int i = 0; i < length; i++)                //
    向左前进
        {
            data[startX, startY + i] = startIndex++;
        }
        for (int i = 0; i < length - 2; i++)            //
    向下前进
        {
            data[startX + 1 + i, startY + length - 1] = startIndex++;
        }
        for (int i = 0; i < length; i++)                //
    向右前进
        {
            data[startX + length-1, startY + length-1-i] = startIndex++;
        }
        for (int i = 0; i < length - 2; i++)            //
    向上前进
        {
            data[startX + length - 2 - i, startY] = startIndex++;
        }

        Process(data, startIndex, startX + 1, startY + 1, length - 2);    //
    下一轮填充
    }

    为了使代码易读,这里我采用的是递归的方式,其实这种尾递归编译器应该是会将其优化为循环的,如果对编译器不信任也是很容易将其转换为循环的(在外围加个while循环就可以了)。

  • 相关阅读:
    Qt5.3.0 for android windows平台下搭建及demo(虫子的博客)
    不分享,用户很少,什么都没有,没有秒传
    Entity Framework 5.0系列之约定配置
    学习SQL关联查询
    SQL语句调优
    数组总结篇(上)
    实现同一套代码针对不同平台工程的编辑和编译
    dispatch队列
    SOCKET网络编程快速上手(一)
    Javascript判断两个日期是否相等
  • 原文地址:https://www.cnblogs.com/TianFang/p/1686617.html
Copyright © 2011-2022 走看看