程序设计天梯赛——迎风一刀斩

题目链接https://www.patest.cn/contests/gplt/L3-006

首先 设两个多边形为A和B 

由于存在翻面操作 所以可以改为分别判断A与B 和A与(B的翻面)

同理可以对B进行旋转操作,将B分成8个B' 分别和A进行比对

翻面操作(对y轴)为x=-x  旋转90度(对原点)为 x=-y y=x;

现在问题转换为判断A和B是否可以经过平移可以拼成矩形 

因为A,B拼接肯定存在公共点 所以不妨各枚举A,B上的一点Ai,Bj

将Ai,Bj平移到原点上(A,B跟着平移),然后将A、B重合的边删掉。

最后求出剩余边的上下左右4个边界 那么剩下的边必须满足处于边界上 且共计有4个点位于4角上

(因为存在顺逆时针问题,A,B都加了双向边,所以代码中判断的数目都为双倍)

并且由于切的一刀笔直的 所以之前删掉边的数目必须为2  (如果取消这个条件 即可解决切线为折线的问题)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mem(x,y) memset(x,y,sizeof(x))
#define pb push_back
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair pii;
#define mp make_pair
#define bug puts("===========");
#define zjc puts("");
const double pi=(acos(-1.0));
const double eps=1e-2;
const ll INF=1e18+10;
const ll inf=1e18+10;
const int maxn=10000+50;
const int NV=10000+50;
const int NE=1e4+100;
const int MOD=1e9+7;
/*=========================*/
struct point{ll x,y;//2个向量的叉积friend ll det(const point &a, const point &b){ return a.x * b.y - a.y * b.x; }int in()  { return ~scanf("%lld %lld", &x, &y); }void out(){ printf("%lld %lld\n", x, y); }bool operator < (const point &b) const{return x p;polygon(int n=0): n(n){ p.resize(n); }void in() {scanf("%d",&n);p.clear(); point pp;for(int i=0;ivec,ans;
vector pp;
bool check(int a,int b,polygon p1,polygon p2){p1.go(a); p2.go(b);vec.clear(); ans.clear();for(int i=0;i=16;
}
bool solve(){for(int i=0;i




本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部