关于检查二维数组中的字段[C ++]

时间:2015-03-28 10:28:17

标签: c++ arrays algorithm

我知道这听起来很愚蠢,但我得问。

关于那件容易的事情。

你有一个二维数组,里面有元素或空,然后你得到一些位置(x和y),我必须从周围的自由字段中绘制一个字段。

我知道该怎么做,它似乎并不优雅或不错。 我这样做的方式是检查我是否在最左边,最右边,顶部,底部等处。然后如果周围有字段,然后是rand()。

它太长了,看起来很不愉快。 我不知道是否有更短的路?感谢。

抱歉我的英语,尽我所能。

3 个答案:

答案 0 :(得分:0)

可能存在一些性能问题。最受批评的情况是当您在角落有[x, y]点时,rand()可能会多次选择无效元素,因此您必须rand()并再次检查。

我这样做的方法是检查可用的邻居并将每个有效的邻居推送到std::vector。之后,只有一个随机数生成,在该向量中选择一个元素:

std::vector<Coordinate> validNeighbours;
// Coordinate is a struct with x and y integers, you can use std::pair<int, int> or the very pointers to the elements

if(/* has neighbour to the left*/)
    validNeighbours.push_back(Coordinate(x - 1, y));

// check in other directions

Coordinate c = validNeighbours[std::rand() % validNeighbours.size()];

在执行模数之前,您可能还想检查validNeighbours是否为空,以防您只有1x1数组(validNeighbours.size()为0)。

答案 1 :(得分:0)

我会使用尺寸 height + 2 width的数组,而不是使用尺寸为 height width 的数组2 。然后你可以用任何有意义的虚拟值填充边界单元格。

答案 2 :(得分:0)

这是一个学校项目,所以我不能使用STL。 ---对其中一个人来说。

但我有自己的解决方案:) 我制作了我的结构Vector(但它就像位置矢量,而不是数组 - 矢量),我得到了这个代码,无论如何我觉得它是最短路的,感谢所有的帮助:

Vector Organism::FindFreeSpace()
{
int height=home->GetHeight();
int width=home->GetWidth();

Vector* choices;

Vector shift;


if(location.x==0 || location.x==width-1)
{
    if(location.y==0 || location.y==height-1)
    {

        choices= new Vector[2];
        choices[0]=( location.x==0 ? Vector(1,0) : Vector(-1,0));
        choices[1]=( location.y==0 ? Vector(0,1) : Vector(0,-1));

        ShuffleChoices(choices, 2);

        for(int h=0;h<2;h++)
        {
            if(home->IsFree(choices[h]+location)==true)
            {
                location+=choices[h];
                shift=choices[h];
                delete[] choices;
                return shift;
            }

        }

    }
    else
    {
        choices=new Vector[3];
        choices[0]=( location.x==0 ? Vector(1,0) : Vector(-1,0));
        choices[1]=Vector(0,1);
        choices[2]=Vector(0,-1);

        ShuffleChoices(choices, 3);

        for(int h=0;h<3;h++)
        {
            if(home->IsFree(choices[h]+location)==true)
            {
                location+=choices[h];
                shift=choices[h];
                delete[] choices;
                return shift;
            }

        }

    }

}
else if(location.y==0 || location.y==height-1)
{

    choices=new Vector[3];
    choices[0]=( location.y==0 ? Vector(0,1) : Vector(0,-1));
    choices[1]=Vector(1,0);
    choices[2]=Vector(-1,0);

    ShuffleChoices(choices, 3);

    for(int h=0;h<3;h++)
    {
        if(home->IsFree(choices[h]+location)==true)
        {
            location+=choices[h];
            shift=choices[h];
            delete[] choices;
            return shift;
        }

    }


}
else
{

    choices=new Vector[4];
    choices[0]=Vector(0,1);
    choices[1]=Vector(1,0);
    choices[2]=Vector(-1,0);
    choices[3]=Vector(0,-1);

    ShuffleChoices(choices, 4);

    for(int h=0;h<4;h++)
    {
        if(home->IsFree(choices[h]+location)==true)
        {
            location+=choices[h];
            shift=choices[h];
            delete[] choices;
            return shift;
        }

    }

}



return Vector(0,0);
}

我知道,你不会得到这一切,但你应该知道我做了什么。