二维数组顺时针输出(C语言实现)

题目概述:

给定一个二维数组,要求顺时针对其进行输出。例如给定二维数组int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};要求输出结果为:1、2、3、6、9、8、7、4、5。

题目分析:

这道题目乍一想似乎很简单,只不过是通过变量控制,输出结果就行。但事实上要实现任意二维数组的顺时针输出,这种方法边不可取。于是自己花了很多时间去思考其求解过程。仔细一想,二维数组实际是一个矩形方阵,是一个平面。而面是由线组成的。再进一步想,一条连续的螺线线不就是一个平面。对,没错,就是这样。我们只需要通过循环从外层开始输出,然后通过变量控制一圈一圈的输出不就好了。如图所示是数组输出的具体过程(不同的颜色表示不同的层)。

代码实现:

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define N 3

 void PrintMatrix(int (*num)[N],int col,int low,int start) 
 { 	
	 assert(num != NULL);
	 assert(col > 0 && low > 0);
	 int C_end = col-start-1; 	    //计算行最后一个位置的坐标           
     int L_end = low-start-1; 	    //计算列最后一个位置的坐标
	 int i = 0; 	                        
	 for(i = start;i <= L_end;i++) 
	 {
		 printf("%d ",num[start][i]); 	     //从左到右打印行 	
	 }
	 if(C_end > start)
	 {
		//由于从左到右输出完整的一行,故从上到下输出时,从下一行最后位置开始输出
	    for(i = start+1;i <= C_end;i++)     
	    {
		    printf("%d ",num[i][L_end]); 	 //从上到下打印列 	
	    }	
	 }
	 else
	 {return;}
	 if(L_end > start)
	 {
		//由于从上到下输出完整的一列,故从右向左打印时,从前一列最后位置开始输出
	    for(i = L_end - 1;i >= start;i--)   
	    {
		    printf("%d ",num[C_end][i]);    //从右向左打印行 	
	    }
	 }
	 else
	 {return;}
	 //如果从下向上输出时,下一行和上一行的下标差为1,说明这一圈输出完成,不进行从下到上的打印
	 if(C_end - start != 1) 	
	 { 		
		 for(i = C_end-1;i >= start+1;i--) 		
		 { 			
			 printf("%d ",num[i][start]); 	 //从下到上打印列 		
		 } 	
	 } 
	 else
	 {return;}
 } 

 void Print_Matrix(int (*num)[N],int col,int low) 
 { 	
	 if(num == NULL || col <= 0 || low <= 0) 		
	 {
		 return; 	
	 }
	  printf("数组顺序针输出结果是:");
	 int start = 0; 	
	 while(col > 2 * start && low > 2 * start) 	//圈数循环
	 { 		
		 PrintMatrix(num,col,low,start); 		
		 start++; 	
	 } 
	 printf("\n");
 } 

 int main() 
 { 	
	 //测试用例:
	 int num[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
	 int num1[4][3] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};	
	 Print_Matrix(num,3,3); 
	 Print_Matrix(num1,4,3); 
	 return 0; 
 }

输出结果:

发布了40 篇原创文章 · 获赞 124 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/FDk_LCL/article/details/90551377