来自安捷伦的一道笔试题,向NxN数组按螺旋的方式写入1——NxN的自然数
自己想的思路,核心是
1、如何决定是否该转弯?方法是看是否“到达数组边界(前期)”或者是否“下一个要写入的方向已经有数(后期)”
2、如何选择退出条件?方法是看写入数是否达到NxN
上代码
#include <iostream>
#include <vector>
#include <stdio.h>
#include <string.h>
using namespace std;
class CircleArray{
public:
CircleArray(int d)
{
row = 0;
col = 0;
value = 1;
dir = 1;//1 l2r, 2 r2d, 3 d2l, 4 l2u
dim =d;
a = new int*[dim];//二维矩阵,则内侧索引都是一维数组指针的数组
for(int i = 0; i < dim; i++)
{
a[i] = new int[dim];
memset(a[i], 0, sizeof(int)*dim);//初始化为0,这样当遇到不为0时就表明碰壁了
}
}
~CircleArray()
{
for (int i = 0; i < dim; i++)
{
delete [] a[i];
a[i] = 0;
}
delete [] a;
a = 0;
}
void fillArray()
{
while (value <= dim*dim)
{
a[row][col] = value;
switch (dir)
{
case 1://left to right
{
if (col == dim-1 || 0 != a[row][col+1])
{
dir = 2;
row++;
}else{
col++;
}
break;
}
case 2://right to down
{
if (row == dim-1 || 0 != a[row+1][col])
{
dir = 3;
col--;
}else{
row++;
}
break;
}
case 3://down to left
{
if (col == 0 || 0 != a[row][col-1])
{
dir = 4;
row--;
}else{
col--;
}
break;
}
case 4://left to up
{
if (row == 0 || 0 != a[row-1][col])
{
dir = 1;
col++;
}else{
row--;
}
break;
}
default:
{
printf("unknown direction!\n");
return;
}
}
value++;
}
}
void displayArray()
{
for (int i = 0; i < dim; i++)
{
for (int j = 0; j < dim; j++)
{
printf("%u\t", a[i][j]);
}
printf("\n");
}
}
private:
int **a; //二维数组指针
int dim; //方阵的size
int row, col; //当前行、列
int value; //当前写入值
int dir; //填写的方向
};
int main()
{
CircleArray a(6);
a.fillArray();
a.displayArray();
return 0;
}
运行效果