#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");
}
可以看出,代码行数少一半