您的位置:首页 > 职场人生

剑指offer 面试题20 顺时针打印矩阵

2014-08-31 21:37 405 查看
E:\arithmetic\PrintRotateArray

思路:以圈为单位打印(k),每圈又分4部分。计算好每圈的起始位置((k,k)),和每圈每部分的终止条件。

注意:1.二维数组的传参。2.宏定义加括号。3。临界终止条件。

#include <stdio.h>

#define MIN(a, b) ( (a) < (b) ? a : b )

void printArray(int **arr, int row, int col);

int main(int argc, char *argv[])
{
int arr[4][4];
int i = 0 , j = 0;
for(i = 0 ; i<4; i++){
for(j=0 ; j<4 ; j++){
arr[i][j] = 4*i+j ;
}
}

int arr2[5][4];
for(i = 0 ; i<5; i++){
for(j=0 ; j<4 ; j++){
arr2[i][j] = 4*i+j ;
}
}
printf("row = %d \t, col = %d\n", sizeof(arr2)/sizeof(int), sizeof(arr2[0])/sizeof(int));//20 4看来在内存中是当成一维数组

int arr3[5][5];
for(i = 0 ; i<5; i++){
for(j=0 ; j<5 ; j++){
arr3[i][j] = 5*i+j ;
}
}
printArray(arr3, 5, 5);
return 0;
}

void printArray(int **arr, int row, int col){
int m, n, k;
m = 0; n = 0; k = 0;
while(k<(float)(MIN(row, col) / 2.0)){
//		printf("*********%d\n", k);

m = k;
n = k;
while(n<col-k){
//			printf("%d\t", arr[m]
);
printf("%d\t", *(arr+m*row+n));
n++;
}

n--;//!!!!! 别忘了!!!
m++;
while(m<row-k){
//		printf("%d\t", arr[m]
);
printf("%d\t", *(arr+m*row+n));
m++;
}

m--;//!!!!!
n--;
while(n>=k){
//	printf("%d\t", arr[m]
);
printf("%d\t", *(arr+m*row+n));
n--;
}

n++;//!!!!!
m--;
while(m>=k+1){
//			printf("%d\t", arr[m]
);
printf("%d\t", *(arr+m*row+n));
m--;
}

k++;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: