联想笔试2011,顺时针输出矩阵

顺时针打印矩阵

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如:如果输入如下矩阵:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值