鄂州网站开发,用wix做外贸网站,建一个信息 类网站,大丰专业做网站Axial symmetry FZU - 2035
题意#xff1a;
给一个多边形#xff0c;边平行于x轴或者y#xff0c;问是否存在对称轴
题解#xff1a;
将每个点的坐标#xff0c;以及每个边的中点的坐标#xff0c;按照顺时针顺序存入#xff0c;多边形的对称轴一定穿过对应两个点
给一个多边形边平行于x轴或者y问是否存在对称轴
题解
将每个点的坐标以及每个边的中点的坐标按照顺时针顺序存入多边形的对称轴一定穿过对应两个点一共有n个候选对称轴我们依次枚举判断就行当枚举一个对称轴时判断其他点是否关于其对称判断方法两个直线是否垂直中点是否在对称轴上 当然对称轴的斜率k有可能不存在或者为0记得特判 思路简单不好写
代码
#include cstdio
#include cstring
#include cmath
using namespace std;
const int N 1005;struct Node {double x,y;Node() {}Node(double _x,double _y) {x _x;y _y;}
}node[N], p[2*N];
bool equ(double x,double y){if(abs(x-y)0.0000001)return 1;else return 0;
}
int n;
int main() {int t,cas 1;scanf(%d,t);while(t--) {scanf(%d,n);for(int i 0; i n; i) {scanf(%lf%lf,node[i].x,node[i].y);}node[n] node[0];int tot 0;p[tot] node[0];for(int i 0; i n; i) {p[tot] Node((node[i].x node[i1].x) / 2, (node[i].y node[i1].y) / 2);p[tot] node[i1];}int a,b;double k1, k2, c;bool ok, flag false;for(int i 0; i n; i) {ok true;if( p[i].x p[in].x ) { //如果分母为0则对称轴垂直于x轴for(int j 1; j n; j) { //对称点 ij 和 i-j 2na (ij);b (i-j2*n);if( (p[a].x p[b].x)/2 ! p[i].x || (p[a].y ! p[b].y)) {ok false;break;}}}else if( p[i].y p[in].y) { //如果分子为0则对称轴垂直于y轴for(int j 1; j n; j) {a (ij);b (i-j2*n);if( (p[a].y p[b].y)/2 ! p[i].y || (p[a].x ! p[b].x)) {ok false;break;}}}else{double K,B;K(p[i].y-p[in].y)/(p[i].x-p[in].x);Bp[i].y-K*p[i].x;for(int j 1; j n; j) {a (ij);b (i-j2*n);double k(p[a].y-p[b].y)/(p[a].x-p[b].x);//ykxb -- by-k double xx(p[a].xp[b].x)/2,yy(p[a].yp[b].y)/2; if(equ(k*K,-1)0||equ(yy,xx*KB)0) {ok false;break;}}}if(ok) {flag true;break;}}printf(Case %d: ,cas);if(flag) {printf(YES\n);}else {printf(NO\n);}}return 0;
}