【问题标题】:Spiral array from a random starting position随机起始位置的螺旋阵列
【发布时间】:2013-11-12 18:03:13
【问题描述】:

考虑一个数组

0000
0000
0000

然后在数组中一个完全随机的位置生成一个数

0000
0000
00x0

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

我已经知道如何以螺旋顺序从元素 [0][0] 到 [1][2](顺时针),但是如果我的初始位置是随机的,我该怎么做呢?那么,我该如何逆时针逆时针?以此类推,但应该从那个随机位置开始(随机生成的2个数字将是位置)。

【问题讨论】:

  • spiral order 是什么意思?如果这意味着从 array[0][3] 跳转到 array[1][0] 以及从 array[1][3] 跳转到 array[2][0] 等等,我建议你简单地使用一个维数组,将其解释为二维并仅通过递增和递减索引对其进行迭代。
  • 另外,在您的具体示例中,如果我顺时针方向(从 (2,2) -> (2,1) -> .... -> (1,3) -> (2 ,3)) 当我被困在右下角时,如何继续“螺旋”?换句话说,我认为“螺旋顺序”可能并不总是可能取决于起始位置和方向,除非你有一个精确的定义来解释这种情况......
  • 我的意思是 [0][0] [0][1] [0][2] [0][3] [1][3] [2][3] [2][ 2] [2][1] [2][0] [1][0] 等

标签: c++ arrays random


【解决方案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 ++;
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 2014-08-10
    • 2015-06-10
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多