先从左往右输出,再上往下,再右往做,再下往上,从1开始自增1的顺序进行编号。我的想法先将第一个二维数组,全部赋值0,然后定义一个标志flag作为这四个编号的方向的记录。
左往右:行不变,列++
上往下:行–,列不变
右往左:行不变,列–
下往上:行–,列不变
遇到不为0的数或者移动时超出矩阵维数就改变一次方向。
代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
int **matrix = new int* [n];//c++定义二维数组的方式
int flag = 1;//记录方向
int row = 0, column = 0;
for(row = 0; row < n; row++)
{
matrix[row] = new int[n];
for(column = 0; column < n; column++)
{
matrix[row][column] = 0;
}
}
row = 0, column = 0;
for(int k = 1; k <= n * n; k++)
{
switch(flag)
{
case 1:
{
if(column < n && matrix[row][column] == 0)
{
matrix[row][column] = k;
column++;
}
else
{
column--;
row++;
flag = 2;
k--;
}
}
break;
case 2:
{
if(row < n && matrix[row][column] == 0)
{
matrix[row][column] = k;
row++;
}
else
{
row--;
column--;
flag = 3;
k--;
}
}
break;
case 3:
{
if(column < n && matrix[row][column] == 0)
{
matrix[row][column] = k;
column--;
}
else
{
column++;
row--;
flag = 4;
k--;
}
}
break;
case 4:
{
if(row < n && matrix[row][column] == 0)
{
matrix[row][column] = k;
row--;
}
else
{
row++;
column++;
flag = 1;
k--;
}
}
break;
}
}
for(row = 0; row < n; row++)
{
for(column = 0; column < n; column++)
{
printf("%3d ",matrix[row][column]);
}
delete matrix[row];
putchar('\n');
}
return 0;
}