顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则依次打印出数字1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10。
这个其实实现起来不难,就是那边边界条件,以及什么时候需要+1换方向的,一不注意就错了,比较辛酸。
#include<stdio.h>
#define N 4
void DisplayClockwise( int (*arr)[4] , int n)
{
int row=0;
int column=0;
int direction=0; //0:left->right 1:up->down 2:right->left 3:down->up
while(direction<16)
{
if((direction++)%4==0)
{
//left->right
while( row<n && arr[column][row]!=0 )
{
printf("%d ",arr[column][row]);
arr[column][row]=0;
if(row==n-1)
{
break;
}
else if( arr[column][row+1]!=0)
++row;
}
++column;//why is here ? but not int the "if" inside while() just think
}
if((direction++)%4==1)
{
//up->down
while( column<n && arr[column][row]!=0 )
{
printf("%d ",arr[column][row]);
arr[column][row]=0;
if(column==n-1)
{
break;
}
else if( arr[column+1][row]!=0)
++column;
}
--row;
}
if((direction++)%4==2)
{
//right->left
while( row>-1 && arr[column][row]!=0 )
{
printf("%d ",arr[column][row]);
arr[column][row]=0;
if(row==0)
{
break;
}
else if( arr[column][row-1]!=0)
--row;
}
--column;
}
if((direction++)%4==3)
{
//down->up
while( column>-1 && arr[column][row]!=0 )
{
printf("%d ",arr[column][row]);
arr[column][row]=0;
if(column==0)
{
break;
}
else if( arr[column-1][row]!=0)
--column;
}
++row;
}
}
}
int main()
{
int arr[N][N];
int i;
int j;
//initalization
//try to use less varialbles
for(i=0; i<N; i++)
for(j=0; j<N; j++)
{
arr[i][j]=4*i+j+1; //1 2 3...
}
for(i=0; i<N; i++)
{
for(j=0; j<N; j++)
{
printf("%-3d ",arr[i][j]);
}
printf("\n");
}
DisplayClockwise( arr , N);
return 0;
}