矩阵螺旋输出

矩阵螺旋输出_技术
矩阵螺旋输出_#define_02

代码
#include <stdio.h>
#include <memory.h>
int matrix[100][100];
int mark[100][100];
int m,n;
void RunRight(int *km,int *kn,int *cnt)
{
    int x,y;
    while(*km<m && *kn<n && *km>=0 && *kn>=0)
    {
        if(!mark[*km][*kn]){
            printf("%d",matrix[*km][*kn]);
            mark[*km][*kn]=1;
            (*cnt)++;
            if(*cnt<m*n)
                printf(" ");
            x=*km;
            y=*kn;
        }
        (*kn)++;
    }
    *km=x;
    *kn=y;
}
void RunDown(int *km,int *kn,int *cnt)
{
    int x,y;
    while(*km<m && *kn<n && *km>=0 && *kn>=0)
    {
        if(!mark[*km][*kn]){
            printf("%d",matrix[*km][*kn]);
            mark[*km][*kn]=1;
            (*cnt)++;
            if(*cnt<m*n)
                printf(" ");
            x=*km;
            y=*kn;
        }
        (*km)++;
    }
    *km=x;
    *kn=y;
}
void RunLeft(int *km,int *kn,int *cnt)
{
    int x,y;
    while(*km<m && *kn<n && *km>=0 && *kn>=0)
    {
        if(!mark[*km][*kn]){
            printf("%d",matrix[*km][*kn]);
            mark[*km][*kn]=1;
            (*cnt)++;
            if(*cnt<m*n)
                printf(" ");
            x=*km;
            y=*kn;
        }
        (*kn)--;
    }
    *km=x;
    *kn=y;
}
void RunUp(int *km,int *kn,int *cnt)
{
    int x,y;
    while(*km<m && *kn<n && *km>=0 && *kn>=0)
    {
        if(!mark[*km][*kn]){
            printf("%d",matrix[*km][*kn]);
            mark[*km][*kn]=1;
            (*cnt)++;
            if(*cnt<m*n)
                printf(" ");
            x=*km;
            y=*kn;
        }
        (*km)--;
    }
    *km=x;
    *kn=y;
}
int main() {
    
    memset(matrix,0,sizeof(matrix));
    memset(mark,0,sizeof(mark));
    
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            scanf("%d",&matrix[i][j]);
    int cnt=0;
    int km=0,kn=0;
    while(cnt<m*n)
    {
        RunRight(&km,&kn,&cnt);
        RunDown(&km,&kn,&cnt);
        RunLeft(&km,&kn,&cnt);
        RunUp(&km,&kn,&cnt);
    }
    printf("\n");
}

这段代码四个函数RunRight,RunLeft,RunUp,RunDown都很类似,可以优化下

利用宏优化
#include <stdio.h>
#include <memory.h>
int matrix[100][100];
int mark[100][100];
int m,n;
#define Right (*kn)++
#define Down  (*km)++
#define Left  (*kn)--
#define Up    (*km)--
#define Run(direction) {\
    int x,y;\
    while(*km<m && *kn<n && *km>=0 && *kn>=0)\
    {\
        if(!mark[*km][*kn]){\
            printf("%d",matrix[*km][*kn]);\
            mark[*km][*kn]=1;\
            (*cnt)++;\
            if(*cnt<m*n)\
                printf(" ");\
            x=*km;\
            y=*kn;\
        }\
        direction;\
    }\
    *km=x;\
    *kn=y;\
}
void RunRight(int *km,int *kn,int *cnt) Run(Right);
void RunDown(int *km,int *kn,int *cnt) Run(Down);
void RunLeft(int *km,int *kn,int *cnt) Run(Left);
void RunUp(int *km,int *kn,int *cnt) Run(Up);

int main() {
    memset(matrix,0,sizeof(matrix));
    memset(mark,0,sizeof(mark));
    
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            scanf("%d",&matrix[i][j]);
    int cnt=0;
    int km=0,kn=0;
    while(cnt<m*n)
    {
        RunRight(&km,&kn,&cnt);
        RunDown(&km,&kn,&cnt);
        RunLeft(&km,&kn,&cnt);
        RunUp(&km,&kn,&cnt);
    }
    printf("\n");
}

可以看出,代码行数少一半