有一个问题,他们在图表上有点(约100个)并且它们都旋转一定量,除了其中一个。因此,我通过从第一组点的中心距离,以及距第二组中心的距离来解决这个问题,然后,在比较它们之后,一组将没有匹配的距离 - 这将是错误的点。
#include <iostream>
#include <cmath>
#include <math.h>
using namespace std;
int main()
{
int star1, star2;
cin>>star1;
int x1[star1], y1[star1];
for (int i=0; i<star1; i++)
{cin>>x1[i]>>y1[i];}
cin>>star2;
int x2[star2], y2[star2];
for (int i=0; i<star2; i++)
{cin>>x2[i]>>y2[i];}
int d1[star1], d2[star2];
for (int i=0; i<star1; i++)
{d1[i]=sqrt(x1[i]*x1[i]+y1[i]*y1[i]);
d2[i]=sqrt(x2[i]*x2[i]+y2[i]*y2[i]);
}
int dis=0; //the ones furthest from the center will be gone
if (star1>star2)
{for (int i=0; i<(star1-star2); i++)
{if (d1[i]<d1[i+1])
{dis=i+1;} }
for (int i = dis; i < star1; i++)
{d1[dis] = d1[dis+1];
d1[star1-1] = 0;}
}
else if (star2>star1)
{for (int i=0; i<(star2-star1); i++)
{if (d2[i]<d2[i+1])
{dis = i+1;} }
for (int i = dis; i < star2; i++)
{d2[dis] = d2[dis+1];
d2[star2-1] = 0;}
}
int one, two;
for (int begin=0; begin<star1; begin++)
{
for (int i=0; i<star2; i++)
{if (d1[begin]==d2[i])
{one=begin; two=i;
goto finish;}}
}
finish:
cout<<one<<" "<<two;
}
原始问题:http://www.codeabbey.com/index/task_view/wandering-star 我的代码有问题,或者我的解释有问题吗?
答案 0 :(得分:1)
我看到你遇到的第一个问题是你假设旋转点是原点。如果该组旋转了不同的点怎么办?
此外,在我看来,您发布的链接上的提示表示第二张图片是第一张图像的轻微旋转和轻微移位。这意味着两组中的旋转点可能不同。此外,请注意问题陈述表明边缘附近的星可能会离开图像空间。这种情况需要考虑。
尝试考虑如何在每张图像中找到旋转点。它有什么属性,有没有什么方法可以使用几何属性来隔离它?如果您能够获得两个轮换点,则可以按照建议的解决方案进行操作。
答案 1 :(得分:0)
int d1[star1], d2[star2];
d2
数组的大小为star2
。
for (int i=0; i<star1; i++)
{if (d1[begin]==d2[i])
内部循环i
从0迭代到star1-1
,但d2
数组的大小为star2
。
这似乎是错误。这应该是:
for (int i=0; i<star2; i++)
{if (d1[begin]==d2[i])