我知道这听起来很愚蠢,但我得问。
关于那件容易的事情。
你有一个二维数组,里面有元素或空,然后你得到一些位置(x和y),我必须从周围的自由字段中绘制一个字段。
我知道该怎么做,它似乎并不优雅或不错。 我这样做的方式是检查我是否在最左边,最右边,顶部,底部等处。然后如果周围有字段,然后是rand()。
它太长了,看起来很不愉快。 我不知道是否有更短的路?感谢。
抱歉我的英语,尽我所能。
答案 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);
}
我知道,你不会得到这一切,但你应该知道我做了什么。