螺旋方阵

来源:互联网 发布:伪装地理位置软件 编辑:程序博客网 时间:2024/04/30 02:21

今天帮同学做C语言课程设计,遇到一个好点的题目,拿出来分享。

下面是一个5 * 5阶的螺旋方阵,编程找印出此形式的n * n阶方阵(顺时针旋进).
   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

我用的是递归算法,设置四个变量:左边界left,右边界right,上边界up,下边界down。每调用一次递归在二维数组中存一层(圈)数据,然后把left加1,right减1,up加1,down减1。left > right为递归出口。

实现代码如下:

#include <stdio.h>

int array[100][100];

void square_matrix(int left, int right, int up, int down, int v, int n)
{
     int x, y, i, j, k, m;

     if (left <= right) {
         for (i = left; i <= right; i ++) array[up][i] = v ++;
         for (k = up + 1;k < down; k ++) array[k][right] = v ++;
         for (j = right; j > left; j --) array[down][j] = v ++;
         for (m = down; m > up; m--) array[m][left] = v ++;
         square_matrix(left + 1, right - 1, up + 1, down - 1, v, n);
     } else
         for (x = 0; x < n; x ++) {
             for (y = 0; y < n; y ++)
                 printf("%4d", array[x][y]);
             printf("/n");
         }
}

int main(int argc, char* argv[])
{
    int n;

    scanf("%d", &n);
    
    square_matrix(0, n - 1, 0, n - 1, 1, n);
    
    return 0;
}

补充(非递归算法):

#include <stdio.h>

int main(int argc, char* argv[])
{
    int a, b, c, d, i, n, num = 1, array[20][20];

    scanf("%d", &n);
    
    /* a, b, c, d分别为上、下、左、右边界,a、b为行号,c、d为列号 */
    for (a = 0, b = n - 1, c = 0, d = n - 1; a <= b; a ++, b --, c ++, d --) {
        for (i = c; i <= d; i ++) array[a][i] = num ++;
        for (i = a + 1; i < b; i ++) array[i][d] = num ++;
        for (i = d; i > c; i --) array[b][i] = num ++;
        for (i = b; i > a; i --) array[i][c] = num ++;
    }

    for (i = 0; i < n; i ++) {
        for (a = 0; a < n; a ++) printf("%5d", array[i][a]);
        printf("/n");
    }

    return 0;
}

 

======== 转载自 http://blog.chinaunix.net/u/22520/showart_159552.html ========