螺旋矩阵

看到最近有螺旋矩阵的东东,我也来凑个热闹!

借用下别人的图片

class Program {
    static void Main(string[] args) {
        for(int i = 1; i <= 10; i++) {
            OutputLuoXuanJuZhen(i);
            Console.WriteLine();
        }
        Console.Read();
    }
    /// <summary>
    /// n为第一行包含的元素个数
    /// </summary>
    /// <param name="n"></param>
    static void OutputLuoXuanJuZhen(int n) {
        int[,] array = new int[n, n];

        //计算圈数
        int cycles = 0;
        if(n % 2 == 0) {
            cycles = n / 2;
        } else {
            cycles = n / 2 + 1;
        }

        for(int i = 0; i < cycles; i++) {
            SetArray(i, n, ref array);
        }

        int j = 0;
        foreach(int el in array) {
            Console.Write(string.Format("{0:000}", el) + " ");
            j++;
            if(j%n==0){
                Console.WriteLine("");
            }
        }
    }

    static void SetArray(int rowno, int rowCou, ref int[,] array) {
        int couRow, x, y;
        couRow = rowCou - 2 * rowno;
     //获取设置画圈圈的起始值,这个地方要注意,要观察值的变化,多写几个,再利用数学的公式算出表达式。如1+2+3+...+n=n(n+1)/2
        int preInt = 4 * ((rowCou - 1) * rowno - (rowno) * (rowno - 1));

        x = y = 0;
        //上
        for(int i = 1; i <= couRow; i++) {
            preInt++;
            if(i == 1) {
                x = y = rowno;
            } else {
                y++;
            }
            array[x, y] = preInt;
        }

        //右
        for(int i = 2; i <= couRow; i++) {
            preInt++;
            x++;
            array[x, y] = preInt;
        }

        //下
        for(int i = 2; i <= couRow; i++) {
            preInt++;
            y--;
            array[x, y] = preInt;
        }

        //左
        for(int i = 2; i < couRow; i++) {
            preInt++;
            x--;
            array[x, y] = preInt;
        }
    }
}

思路:循环画圈圈,每个圈圈分4段,上右下左,每段的长度都是第一行元素长度-2*圈数

另:画圈圈的时候,如果x和y反过来赋值,就是反向画圈圈。

 

posted @ 2013-10-13 17:38  学海一叶  阅读(237)  评论(0编辑  收藏  举报