输入n*n矩阵的n值,打印出一个螺旋矩阵,如下面例子:
当n= 5时,输出
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
方法1:
用静态的二维数组保存,到方法2在动态生成,随着n的变化而变化,根据右,下,左,上的顺序,就可以走出一个螺旋数组。
参考代码:
#include <stdio.h>
int arr[100][100], n;//暂时先用静态的二维数组保存,到方法2在动态生成,随着n的变化而变化
enum EmDir
{
emRight = 1,
emDown = 2,
emLeft = 3,
emUp = 4,
};
int IsRightDirOk(int row, int column)
{
return (column + 1 < n && 0 == arr[row][column + 1]);
}
int IsDownDirOk(int row, int column)
{
return (row + 1 < n && 0 == arr[row + 1][column]);
}
int IsLeftDirOk(int row, int column)
{
return (column - 1 >= 0 && 0 == arr[row][column - 1]);
}
int IsUpDirOk(int row, int column)
{
return (row - 1 >= 0 && 0 == arr[row - 1][column]);
}
int GetNextStepDir(int curDir, int row, int column)
{
if (curDir == emRight)
return IsRightDirOk(row, column) ? emRight : emDown;
else if (curDir == emDown)
return IsDownDirOk(row, column) ? emDown : emLeft;
else if (curDir == emLeft)
return IsLeftDirOk(row, column) ? emLeft : emUp;
return IsUpDirOk(row, column) ? emUp : emRight;
}
int main()
{
int i, j, row = 0, column = 0, nCount = 1, curDir = (int)emRight;
printf("输入n*n矩阵的n值:");
scanf_s("%d", &n);
while (nCount <= n * n)
{
arr[row][column] = nCount++;
curDir = GetNextStepDir(curDir, row, column);
if (emRight == curDir)
column++;
else if (emDown == curDir)
row++;
else if (emLeft == curDir)
column--;
else
row--;
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf("%5d", arr[i][j]);
printf("\n");
}
return 0;
}
方法2: