螺旋打印矩阵 -- C语言

需求

 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
 
 示例 1:
 
 输入:
 [
  [ 1, 2, 3 ],
  [ 4, 5, 6 ],
  [ 7, 8, 9 ]
 ]
 输出: [1,2,3,6,9,8,7,4,5]
 示例 2:
 
 输入:
 [
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9,10,11,12]
 ]
 输出: [1,2,3,4,8,12,11,10,9,5,6,7]
 

思路

循环打印数组,定义方向来进行转向,每次方向++,用方向取余方向总数,就可以找到正确的方向

另外,注意二维指针指向的连续内存和二维数组存储格式不同,二维数组可以理解为首先每个元素保存行指针(也就是 int (*p)[col_num]),行指针再指向行的真实内容,所以内存不是连续的。所以,做测试用例的时候,指针的分配和初始化要特别注意,不要傻乎乎的分配连续内存直接使用

 

代码实现

/*
 * 需求

 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
 
 示例 1:
 
 输入:
 [
  [ 1, 2, 3 ],
  [ 4, 5, 6 ],
  [ 7, 8, 9 ]
 ]
 输出: [1,2,3,6,9,8,7,4,5]
 示例 2:
 
 输入:
 [
   [1, 2, 3, 4],
   [5, 6, 7, 8],
   [9,10,11,12]
 ]
 输出: [1,2,3,4,8,12,11,10,9,5,6,7]

 gcc SpiralOrder.c -g -o a.exe

 */
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>


#define DIR_RIGHT 		0
#define DIR_DOWN		1
#define DIR_LEFT		2
#define DIR_UP			3
#define DIR_MAX			4



/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize){

	if(0 == matrixSize){
		*returnSize = 0;
		return NULL;
	}

	int direct = DIR_RIGHT; 	/*最开始向右走*/
	int row = matrixSize;		/*初始行长度*/
	int col = *matrixColSize;	/*初始列长度*/
	int row_start = 0;			/*从0,0出发*/
	int row_end = row - 1;		/*开始是一整行*/
	int col_start = 0;			/*从0,0出发*/
	int col_end = col - 1;		/*开始是一整列*/
	int i = 0, j = 0;
	int c = 0, total = row * col;

	int * p = (int *) malloc(row * col * sizeof(int));
	if(NULL == p){
		printf("spiralOrder malloc error\n");
		return NULL;
	}

	while(c < total){

		direct = direct % DIR_MAX;
		
		if(DIR_RIGHT == direct){
			i = row_start;
			for(j = col_start; j <= col_end; j++){
#ifdef DEBUG				
				printf("p[%d] = matrix[%d][%d] = %d\n", c, i,j,matrix[i][j]);
#endif
				p[c++] = matrix[i][j];
			}
			/*变换方向*/
			direct++;
			/*打印完一行,行起始变大*/
			row_start++;
		} else if (DIR_DOWN == direct){
			j = col_end;
			for(i = row_start; i <= row_end; i++){
#ifdef DEBUG				
				printf("p[%d] = matrix[%d][%d] = %d\n", c, i,j,matrix[i][j]);
#endif

				p[c++] = matrix[i][j];
			}
			/*变换方向*/
			direct++;
			/*打印完一列,列结尾变小*/
			col_end--;
		} else if (DIR_LEFT == direct){
			i = row_end;
			for(j = col_end; j >= col_start; j--){
#ifdef DEBUG				
				printf("p[%d] = matrix[%d][%d] = %d\n", c, i,j,matrix[i][j]);
#endif
				p[c++] = matrix[i][j];
			}
			/*变换方向*/
			direct++;
			/*打印完一行,行结尾变小*/
			row_end--;
		} else if (DIR_UP == direct){
			j = col_start;
			for(i = row_end; i >= row_start; i--){
#ifdef DEBUG				
				printf("p[%d] = matrix[%d][%d] = %d\n", c, i,j,matrix[i][j]);
#endif
				p[c++] = matrix[i][j];
			}
			/*变换方向*/
			direct++;
			/*打印完一列,列起始变大*/
			col_start++;
		} else {
			
		}
	}
	
	*returnSize = c;
	return p;
}


void testspiralOrder(void){

 	int matrix1[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
	int matrix2[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
	int returnSize = 0;
	int matrixSize = 0;
	int matrixColSize = 0;
	int * a = NULL;
	int i = 0, j =0;
	int ** matrix = NULL;
	
	printf("\n************  testspiralOrder ************ \n");

	/*testcase 1*/
	matrixSize = 3;
	matrixColSize = 3;

	/*分配一个二维数组,记录到二维指针中*/
	matrix = (int **)malloc(matrixSize * sizeof(int *));
	for(i = 0; i < matrixSize; i++){
		matrix[i] = (int *)malloc(matrixColSize * sizeof(int));
	}
	/*用二维数组初始化二维数组*/
	for(i = 0; i < matrixSize; i++){
	   for(j = 0; j < matrixColSize; j++){
		   matrix[i][j] = matrix1[i][j];
	   }
	}	
	a = spiralOrder(matrix, matrixSize, &matrixColSize, &returnSize);
	printf("\t returnSize = %d\n", returnSize);
	printf("\t [");
	for(i = 0; i < returnSize; i++){
		printf(" %d ", a[i]);
	}
	printf(" ]\n\n");
	free(a);
	a = NULL;
	free(matrix);
	matrix = NULL;

	/*testcase 2*/
	matrixSize = 3;
	matrixColSize = 4;

	/*分配一个二维数组,记录到二维指针中*/
	matrix = (int **)malloc(matrixSize * sizeof(int *));
	for(i = 0; i < matrixSize; i++){
		matrix[i] = (int *)malloc(matrixColSize * sizeof(int));
	}
	/*用二维数组初始化二维数组*/
	for(i = 0; i < matrixSize; i++){
	   for(j = 0; j < matrixColSize; j++){
		   matrix[i][j] = matrix2[i][j];
	   }
	}	
	a = spiralOrder(matrix, matrixSize, &matrixColSize, &returnSize);
	printf("\t returnSize = %d\n", returnSize);
	printf("\t [");
	for(i = 0; i < returnSize; i++){
		printf(" %d ", a[i]);
	}
	printf(" ]\n\n");
	free(a);
	a = NULL;
	free(matrix);
	matrix = NULL;

	/*testcase 2*/
	matrixSize = 0;
	matrixColSize = 0;

	/*分配一个二维数组,记录到二维指针中*/
	matrix = (int **)malloc(matrixSize * sizeof(int *));
	for(i = 0; i < matrixSize; i++){
		matrix[i] = (int *)malloc(matrixColSize * sizeof(int));
	}

	a = spiralOrder(matrix, matrixSize, &matrixColSize, &returnSize);
	printf("\t returnSize = %d\n", returnSize);
	printf("\t [");
	for(i = 0; i < returnSize; i++){
		printf(" %d ", a[i]);
	}
	printf(" ]\n\n");
	free(a);
	a = NULL;
	free(matrix);
	matrix = NULL;
 
	return; 
 
 }


 int main(int argc, char ** argv){
	testspiralOrder();
 }



代码编译

gcc SpiralOrder.c -g -o a.exe

 

调试输出


************  testspiralOrder ************
         returnSize = 9
         [ 1  2  3  6  9  8  7  4  5  ]

         returnSize = 12
         [ 1  2  3  4  8  12  11  10  9  5  6  7  ]

         returnSize = 0
         [ ]

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值