本文變數命名字首:
本文程式碼可以到Github下載:https://github.com/liyuewu-github/DataStructure
/* 列印矩陣 */
void MatrixPrint(int * apMatrix [ ], int m, int n)
{
int iR,iC;
for (iR = 0; iR < m; ++iR)
{
for (iC = 0; iC < n; ++iC)
{
printf("%d ",apMatrix[iR][iC]);
}
printf("\n ");
}
}
/* 矩陣轉圈列印 */
/* 輸入:
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*/
void Matrix_CirclePrint(int* apMatrix[], int iR, int iC)
{
int iTopR, iTopC; /*左上角座標*/
int iBotR, iBotC; /*右下角座標*/
int i,j,m,n;
iTopR = iTopC = 0;
iBotR = iR -1;
iBotC = iC - 1;
while ((iTopR<=iBotR) && (iTopC<=iBotC))
{
/* 規律:列印一行則遍歷列,列印一列則遍歷行 */
if (iTopR == iBotR) /* 一行 */
{
for (i = iTopC; i <= iBotC; i++)
{
printf("%d ",apMatrix[iTopR][i]);
}
}
else if (iTopC == iBotC) /* 一列 */
{
for (i = iTopR; i <= iBotR; i++)
{
printf("%d ",apMatrix[i][iTopC]);
}
}
else /* 多行多列 */
{
for (i = iTopC; i < iBotC; i++) /* 正向列印行,留最後一個元素,作爲下列起始 */
{
printf("%d ",apMatrix[iTopR][i]);
}
for (j = iTopR; j < iBotR; j++) /* 正向列印列,留最後一個元素,作爲下行起始 */
{
printf("%d ",apMatrix[j][iBotC]);
}
for (m = i; m > iTopC; m--) /* 逆向列印行,留最後一個元素,作爲下列起始 */
{
printf("%d ",apMatrix[iBotR][m]);
}
for (n = j; n > iTopR; n--) /* 逆向列印列,一圈結束 */
{
printf("%d ",apMatrix[n][iTopC]);
}
}
/* 下一圈 */
iTopR++;
iTopC++;
iBotR--;
iBotC--;
}
printf("\n ");
}
/* 正方形矩陣順時針旋轉90度 */
/*
輸入:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
輸出:
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4*/
/* 由外到內依次旋轉,一輪替換1->4;4->16;16->13;13->1; 輪數爲行或列元素個數 */
int ** Matrix_Rorate(int * apMatrix [ ], int iR, int iC)
{
int iTopR, iTopC; /*左上角座標*/
int iBotR, iBotC; /*右下角座標*/
int iTime; /*旋轉次數*/
int iTmp;
int **ppM;
int i;
ppM = malloc(iR * sizeof(int));
for (i = 0; i < iR; ++i)
{
ppM[i] = apMatrix[i];
}
iTopR = iTopC = 0;
iBotR = iR -1;
iBotC = iC - 1;
while (iTopR<iBotR)
{
iTime = iBotR - iTopR; /* 旋轉次數即行或列的元素個數 */
for (i = 0; i < iTime; ++i)
{
iTmp = apMatrix[iTopR][iTopC+i];
apMatrix[iTopR][iTopC+i] = apMatrix[iBotR-i][iTopC]; /*13->1*/
apMatrix[iBotR-i][iTopC] = apMatrix[iBotR][iBotC-i]; /*16->13*/
apMatrix[iBotR][iBotC-i] = apMatrix[iTopR+i][iBotC]; /*4->16*/
apMatrix[iTopR+i][iBotC] = iTmp; /*1->4*/
}
/* 下一圈 */
iTopR++;
iTopC++;
iBotR--;
iBotC--;
}
return ppM;
}
/* 「之」字形列印矩陣 */
/*
輸入:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
輸出:1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16*/
void Matrix_SnakePrint(int* apMatrix[], int iR, int iC)
{
int iTopR, iTopC; /*左上角座標*/
int iBotR, iBotC; /*右下角座標*/
int iRev; /*摺疊列印*/
int i,j;
iTopR = iTopC = 0;
iBotR = iBotC = 0;
iRev = 0;
/* 規律:
1、行列沒到底,斜線首座標(iTopR, iTopC++),尾座標(iBotR++, iBotC)
2、行到底,斜線尾座標(iBotR, iBotC++)
3、列到底,斜線首座標(iTopR++, iTopC)*/
while (iTopR <= iR)
{
if (iRev) /* 向下列印,行++,列-- */
{
for (i = iTopR,j=iTopC; i < iBotR+1; i++,j--)
{
printf("%d ",apMatrix[i][j]);
}
}
else /* 向上列印,行--,列++ */
{
for (i = iBotR,j=iBotC; j < iTopC+1; i--,j++)
{
printf("%d ",apMatrix[i][j]);
}
}
if (iTopC == iC-1) /* 列印到了最後一列,行號下移 */
{
iTopR++;
}
else /* 不到了最後一列,列號下移 */
{
iTopC++;
}
if (iBotR==iR-1) /* 列印到了最後一行,列號下移 */
{
iBotC++;
}
else /* 不到了最後一行,行號下移 */
{
iBotR++;
}
iRev = !iRev;
}
printf("\n ");
return;
}
int main()
{
int aM[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int *pM[4] = {aM[0],aM[1],aM[2],aM[3]};
int **ppM;
printf("--Circle Print--\n");
Matrix_CirclePrint(pM, 4, 4);
printf("--Snake Print--\n");
Matrix_SnakePrint(pM, 4, 4);
printf("--Rorate Print--\n");
printf("input:\n ");
MatrixPrint(pM, 4, 4);
ppM = Matrix_Rorate(pM, 4, 4);
printf("output:\n ");
MatrixPrint(pM, 4, 4);
return 0;
}