今天在一个算法群里看到一个说面试遇到回旋数的问题,就试着写了下,蛋疼,居然费了一个小时……
开始没什么思路,然后分析数值,发现一个好的办法,每次赋值一圈,然后递归,直到完成所有的赋值。
如下图所示:
代码如下:
//num是保存二维数组的指针,startNum为开始的数,为1,x=0,y=0,如果二维数组为n*n,那么size=n-1
void fillNum(int **num, int startNum, int x, int y, int size)
{
if (size < 0)
{
return;
}
else if (size == 0)
{
num[x][y] = startNum;
return;
}
for (int i = 0; i < size; i++)
{
num[x+i][y] = startNum++;
}
for (int i = 0; i < size; i++)
{
num[x+size][y+i] = startNum++;
}
for (int i = size; i > 0; i--)
{
num[x+i][y+size] = startNum++;
}
for (int i = size; i > 0; i--)
{
num[x][y+i] = startNum++;
}
fillNum(num, startNum,x+1,y+1,size-2);
}