我知道这不是一个有趣的主题,但我只是练习一点c ++。 我可以使用哪种方法来查找从一个点可以看到多少个对象。好的,所以这是一个例子:
# # * # *
# * # * #
* # P * *
# # # # #
* # * # *
所以,P是你应该说你能看到多少点的点,#是空格而*是对象。我想我可以使用一种李的算法,一个物体在哪里停止反击......
我做了矩阵
f>>N>>M;
for (i=1;i<=N;i++)
{
for (j=1;j<=M;j++)
{
f>>l;
switch (l)
{
case '#': { a[i][j]=0; break;}
case '*': { a[i][j]=-2; break;}
case 'P': { a[i][j]=-1; break;}
}
}
}
现在,当柜台达到-2停止时......请帮帮我:o3
答案 0 :(得分:1)
这里的基本点是可见性检查。如果(x, y)
行上没有对象,则(px, py)
可以看到某个点(px, py) - (x, y)
。对象只能在整数位置上。所以我们必须检查这一行上的每一点。
..................
. o
. x
. x
. x
. x
. p
假设我们要检查o
中p
的可见性。首先,我们应该计算差异。在这种情况下,o
单位为dx=15
单位,dy=5
单位高于p
。物体只能在某些位置。可能的位置以相等的距离分布在线上。点数由dx
和dy
的最大公约数定义(因为dx
和dy
都需要为整数)。 5和15的gcd是5.所以我们必须检查5个可能的位置(标有x
)。 stepX = dx / gcd = 15 / 5 = 3
和stepY = dy / gcd = 5 / 5 = 1
。最后一点是o
,所以我们不需要检查这个。
我们可以为可见性检查定义一个函数,它执行以下操作(假设有一个gcd
函数):
bool isVisible(int** matrix /*or any other appropriate declaration */, int px, int py, int ox, int oy)
{
int dx = ox - px;
int dy = oy - py;
int div = gcd(abs(dx), abs(dy));
int stepX = dx / div;
int stepY = dy / div;
for(int i = 1; i < div; ++i)
{
int checkX = px + i * stepX; //these could be computed incrementally
int checkY = py + i * stepY;
if (matrix[checkX][checkY] == 2) //blocked
return false;
}
return true;
}
请注意,此功能仅供参考,可能无法正常使用。
如果您构建了矩阵并且知道p
的坐标,那么您所要做的就是迭代每个位置。使用位置调用上述函数以检查它是否可见并在这种情况下递增计数器。在此过程中略过p
。
这是另一个更明显需要gcd的例子。 dx = 16
,dy = 12
..................
. o
.
.
. x
.
.
. x
.
.
. x
.
.
.p
答案 1 :(得分:0)
我所能告诉你的内容如下:
我做了矩阵
假设你的意思是
f>>N>>M;
int a[N][M]; // Note this is non standard!
for循环的初始化是错误的:
for (i=1 /* <---- */ ;i<=N;i++)
c ++中的数组索引从0
开始,你的循环初始化应如下所示:
for (i=0 /* Note the 0 */ ;i<=N;i++)