【劍指offer】順時針列印矩陣

蘭亭風雨發表於2014-05-17

轉載請註明出處:http://blog.csdn.net/ns_code/article/details/26053049


    劍指offer上的第20題,九度OJ上測試通過。

題目描述:

輸入一個矩陣,按照從外向裡以順時針的順序依次列印出每一個數字,例如,如果輸入如下矩陣:

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.

輸入:

輸入可能包含多個測試樣例,對於每個測試案例,

輸入的第一行包括兩個整數m和n(1<=m,n<=1000):表示矩陣的維數為m行n列。

接下來的m行,每行包括n個整數,表示矩陣的元素,其中每個元素a的取值範圍為(1<=a<=10000)。

輸出:

對應每個測試案例,輸出一行,

按照從外向裡以順時針的順序依次列印出每一個數字,每個數字後面都有一個空格。

樣例輸入:
4 41 2 3 45 6 7 89 10 11 1213 14 15 16
樣例輸出:
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 

    這道題目沒有涉及到任何演算法,主要考察邏輯思維,注意各種情況的分析,迴圈退出的條件等。這道題目不像之前的那樣,輸出要特別注意最後一個輸出元素的輸出格式了。

    AC程式碼如下:

#include<stdio.h>
#include<stdlib.h>

/*
順時針列印一圈
*/
void PrintMatrixCirclely(int **num,int m,int n,int start)
{
	int endX = n-start-1;
	int endY = m-start-1;

	int i;
	//從左到右列印行
	for(i=start;i<=endX;i++)
		printf("%d ",num[start][i]);

	//從上到下列印列
	if(start < endY)
	{
		for(i=start+1;i<=endY;i++)
			printf("%d ",num[i][endX]);
	}

	//從右向左列印行
	if(start<endX && start<endY)
	{
		for(i=endX-1;i>=start;i--)
			printf("%d ",num[endY][i]);
	}

	//從下到上列印列
	if(start<endX && start<endY-1)
	{
		for(i=endY-1;i>=start+1;i--)
		{
			printf("%d ",num[i][start]);
		}
	}
}

/*
順時針列印矩陣
*/
void PrintMatrixClockwisely(int **num,int m,int n)
{
	if(num==NULL || m<=0 || n<=0)
		return;
	int start = 0;
	while(m>2*start && n>2*start)
	{
		PrintMatrixCirclely(num,m,n,start);
		start++;
	}
}

int main()
{
	int m,n;
	while(scanf("%d %d",&m,&n) != EOF)
	{
		int **num = (int **)malloc(m*sizeof(int *));
		if(num == NULL)
			exit(EXIT_FAILURE);
		int i;
		for(i=0;i<m;i++)
		{
			num[i] = (int *)malloc(n*sizeof(int));
			if(num[i] == NULL)
				exit(EXIT_FAILURE);
		}

		int j;
		for(i=0;i<m;i++)
			for(j=0;j<n;j++)
				scanf("%d",&num[i][j]);

		PrintMatrixClockwisely(num,m,n);
		printf("\n");

		for(i=0;i<m;i++)
		{
			free(num[i]);
			num[i] = NULL;
		}
		free(num);
		num = NULL;		
	}
	return 0;
}
/**************************************************************
    Problem: 1391
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:520 ms
    Memory:912 kb
****************************************************************/
   

    吐槽下:週末一般來大學城學習,週一到週五晚上一般去圖書館學習,這些點的學習效率是最高的!鑑於實驗室坑跌的考勤規定,週一到週五的上下午不得不呆在實驗室學習,不得不說這個時間段的效率真的是時而好,時而壞,索性開題前把這個時間段用來寫開題報告!

    現在對實驗室真的是一點感情都沒了,滿滿的負能量。對這裡很失望,一個磨滅人理想的地方,對這裡的人也很失望,想找個志趣相投的人真的很難。

    吐槽歸吐槽,其實也早已習慣了,畢竟都圈在裡面了一年了。畢業後大家都要為自己的未來做打算,誰還管得了誰呢?志趣相投的人會成就對方,而臭味相投的人只會毀了彼此。或許每個人的價值觀不同,但現實是早晚要面對的,體諒不到父母的辛苦,就永遠不會長大。

    我很慶幸,在CSDN上結識了挺多有著共同追求的小夥伴,也很慶幸在這裡能找到很多正能量。有些人已經拿到不錯的offer,有些人還在努力,從未放棄,這些都是值得尊敬和學習的人。

    任何人,只要有顆奮鬥的心,併為之長久地堅持和付出,生活總並不會虧待他的。


相關文章