从随机起始位置开始的螺旋阵列

时间:2013-11-12 18:03:14

标签: c++ arrays random

考虑一个数组

0000
0000
0000

然后在数组

中的完整随机位置生成一个数字
0000
0000
00x0

我想要做的是知道数字的位置,让它以螺旋顺序通过数组。我在c ++中找不到一些东西,它是我所知道的唯一语言。

我已经知道如何从元素[0] [0]到[1] [2](顺时针)以螺旋顺序进行,但是如果我的初始位置是随机的,我该怎么做?然后,我如何倒退,逆时针?等等,但开始应该来自那个随机位置(随机产生的2个数字将是位置)。

1 个答案:

答案 0 :(得分:1)

此代码仅在您指向阵列中心时才有效。如果添加正确的边界检查,则应该按照您的描述进行操作。我做了一个假设(基于你的第一个例子)当你完成所有现有元素时,你移动到外部集合。即

0000
0000
00x0

变为

2222
2111
21x1

按此顺序触摸

  6 7 8 9
 11 1 2 3
 10 5 X 4

2表示第二个圆圈,1表示第一个圆圈。

该程序的输出是(我只是在每个元素中存储“半径”)

pre traversal
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 

post traversal
2 2 2 2 2 
2 1 1 1 2 
2 1 0 1 2 
2 1 1 1 2 
2 2 2 2 2 



// what is the maximum possible radius
int getMaxRadius(int x, int y, int size)
{
int toReturn = std::abs(size-x);
if(std::abs(size-y) > toReturn)
    toReturn = std::abs(size -y);

return toReturn ;
}

//is the curernt element next to the current center
bool nextTo(int xCenter, int yCenter, int x, int y, int radius )
{
//if it
if(std::abs(xCenter - x) > radius || std::abs(yCenter - y) > radius)
{
    return false;
}
return true;
}


void circular(int** array, int xCenter, int yCenter, int size)
{
int curRadius = 1;
int maxRadius = getMaxRadius(xCenter, yCenter,size);

while( curRadius<maxRadius) 
{

    //start to the top left of the cur radius
    int curX = xCenter - curRadius; 
    int curY = yCenter - curRadius;

    //go right
    while(nextTo(xCenter, yCenter, curX, curY, curRadius ))
    {
        array[curX][curY] = curRadius;
        curX ++;
    }
    curX--;//we went one too far

    //go down
    while(nextTo(xCenter, yCenter, curX, curY, curRadius ))
    {
        array[curX][curY] = curRadius;
        curY ++;
    }
    curY--;//we went one too far


    //go left   
    while(nextTo(xCenter, yCenter, curX, curY, curRadius ))
    {
        array[curX][curY] = curRadius;
        curX --;
    }
    curX++;//we went one too far

    //goUP
    while(nextTo(xCenter, yCenter, curX, curY, curRadius ))
    {
        array[curX][curY] = curRadius;
        curY --;
    }
    curY++;//we went one too far
    curRadius ++;
}
}