螺旋矩阵算法

螺旋矩阵(4*4)

1   2   3   4

12  13  14  5

11  16  15  6

10  9   8   7

 

实现方法:一个n行n列的螺旋矩阵,共n的平方个元素。用一个二维数据来记录这N的平方个元素,下标(0,0)记录第一行第一列位置的数,下标(k,k)记录第k行k列的数。一次循环找到所有元素的位置,记录在数组中。然后打印

 

由外到内找数的位置。用递归来实现。

 

下面请看代码,用C#来实现

 

/// <summary> /// 打印输出螺旋矩阵 /// </summary> /// <param name="n">基数</param> static void PrintLXNum(int n) { int[,] aArr = new int[n, n]; //初始化数据 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { aArr[i, j] = 0; } } //计算每个数的位置或每个位置的数 for (int i = 1; i <= n*n; i++) { int sX = 0, sY = 0; GetJCPos(n, 1, i,ref sX,ref sY); aArr[sX, sY] = i; } //打印数据 for (int j = 0; j < n; j++) { for (int i = 0; i < n; i++) { Console.Write(aArr[i, j].ToString().PadLeft(4) + " "); } Console.WriteLine(""); } } /// <summary> /// 返回指定基数,指定数的位置 /// </summary> /// <param name="n">基数</param> /// <param name="startNum">起始数</param> /// <param name="jcs">参考数,即指定要返回位置的参考数</param> /// <param name="sX">返回的X坐标</param> /// <param name="sY">返回的X坐标</param> static void GetJCPos(int n, int startNum, int jcs, ref int sX, ref int sY) { int tNum=0; if (n == 1) return; tNum=(n-1)*4; if (jcs >= startNum && jcs < startNum + tNum) { for (int i = 0; i < tNum; i++) { int pFator = 1; if (i > (2 * n - 1 - 1)) pFator = -1; if (i < n && i!=0) { sX += pFator; } else if (i >= n && i < (2 * n - 1)) { sY += pFator; } else if(i>=(2 * n - 1) && i<(3 * n - 2)) { sX += pFator; } else if (i >= (3 * n - 2) && i < (4 * n - 3)) { sY += pFator; } //如果当前这个数正好是我们要找的,则返回 if (startNum + i == jcs) return; } } else { sX++; sY++; GetJCPos(n - 2, startNum + tNum, jcs, ref sX,ref sY); } }

 

不知道我的朋友是否满意。

 

 

你可能感兴趣的:(算法,C#)