现在的位置: 首页 > 综合 > 正文

螺旋算法

2013年10月04日 ⁄ 综合 ⁄ 共 1658字 ⁄ 字号 评论关闭

程序代码:
#include <stdio.h>
#include <conio.h>

#define DOWN    0
#define LEFT    1
#define UP      2
#define RIGHT   3

//N*N矩阵
#define N   5

void printMatrix(int *a[], int n) {
    int i, j;

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

void spiralMatrix(int *a[], int n) {
    int i, j;   //坐标
    int count;  //计数器
    int k;      //循环变量
    int direct;  //方向指示

    i = 0;
    j = --n;
    count = 0;
    direct = DOWN;
    while (n > 0) {
        for (k = 0; k < n; k++) {
            a[i][j] = count++;
            switch (direct) {
            case DOWN:
                i++;
                break;
            case LEFT:
                j--;
                break;
            case UP:
                i--;
                break;
            case RIGHT:
                j++;
                break;
            }
        }
        //如果刚走过的方向为RIGHT, 步长减2, 并校正位置
        if (direct == RIGHT) {
            i++;
            j--;
            n -= 2;
        }
        //换方向
        direct = (direct + 1) % 4;
    }
    if (n == 0) {
        a[i][j] = count;
    }
}

void main(void) {
    int m[N][N] = {0};
    int *a[N];
    int i;

    for (i = 0; i < N; i++) {
        a[i] = m[i];
    }
    spiralMatrix(a, N);
    printMatrix(a, N);
    printf("按任意键退出...");
    getch();
}

又在网上看到一个:

#include <stdio.h>
void main()
{
    int a,b,c,i,j,k,t,I,J,s[9][9];

    scanf("%d", &c);    //输入边长
    if (c>9) return;    //为保持整齐,边长不能大于9

    a=c-1; b=0;         //转折点坐标
    i=1; j=0;           //坐标增量
    I=0; J=0;           //坐标

    for(k=1;k<=c*c;k++)
    {
        s[I][J]=k;
        if(I==a && J==b)    //遇到转折点
        {
            t=a; a=c-b-1; b=t+(i+j>0?0:1);  //改变转折点
            t=i; i=-j; j=t;                 //改变坐标增量
        }
        I+=i; J+=j;     //改变坐标
    }

    for(J=0;J<c;J++)
    {
        for(I=0;I<c;I++) printf("%-2d ",s[I][J]);
        printf("/n");
    }

    return;
}

抱歉!评论已关闭.