【CODEFORCES】 C. Captain Marmot
1 second
256 megabytes
standard input
standard output
Captain Marmot wants to prepare a huge and important battle against his enemy, Captain Snake. For this battle he has n regiments, each
consisting of 4 moles.
Initially, each mole i (1 ≤ i ≤ 4n)
is placed at some position (xi, yi) in
the Cartesian plane. Captain Marmot wants to move some moles to make the regiments compact, if it's possible.
Each mole i has a home placed at the position (ai, bi).
Moving this mole one time means rotating his position point (xi, yi) 90 degrees
counter-clockwise around it's home point (ai, bi).
A regiment is compact only if the position points of the 4 moles form a square
with non-zero area.
Help Captain Marmot to find out for each regiment the minimal number of moves required to make that regiment compact, if it's possible.
The first line contains one integer n (1 ≤ n ≤ 100),
the number of regiments.
The next 4n lines contain 4 integers xi, yi, ai, bi ( - 104 ≤ xi, yi, ai, bi ≤ 104).
Print n lines to the standard output. If the regiment i can
be made compact, the i-th line should contain one integer, the minimal number of required moves. Otherwise, on the i-th
line print "-1" (without quotes).
4
1 1 0 0
-1 1 0 0
-1 1 0 0
1 -1 0 0
1 1 0 0
-2 1 0 0
-1 1 0 0
1 -1 0 0
1 1 0 0
-1 1 0 0
-1 1 0 0
-1 1 0 0
2 2 0 1
-1 0 0 -2
3 0 0 -2
-1 1 -2 0
1
-1
3
3
In the first regiment we can move once the second or the third mole.
We can't make the second regiment compact.
In the third regiment, from the last 3 moles we can move once one and twice another one.
In the fourth regiment, we can move twice the first mole and once the third mole.
题解:这一题就是给你8*n个点,每4个一组,每一个点能够绕某点逆时针旋转,问最后是否能组成一个正方形。
直接暴力出全部可能情况。然后推断是否为正方形即可了。
(推断正方形的时候參考了下别人的代码= =)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib> using namespace std; struct dir
{
int x,y;
}; struct dir d[4][4],h[4]; long long dis[10]; long long dist(long long x1,long long y1,long long x2,long long y2)
{
return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
} int n,ans; int main()
{
scanf("%d",&n);
while (n--)
{
memset(d,0,sizeof(d));
memset(h,0,sizeof(h));
for (int i=0;i<4;i++) scanf("%d%d%d%d",&d[i][0].x,&d[i][0].y,&h[i].x,&h[i].y);
for (int i=0;i<4;i++)
for (int j=1;j<4;j++)
{
d[i][j].x=h[i].x+h[i].y-d[i][j-1].y;
d[i][j].y=d[i][j-1].x-h[i].x+h[i].y;
}
ans=16;
for (int i=0;i<4;i++)
{
for (int j=0;j<4;j++)
for (int k=0;k<4;k++)
for (int z=0;z<4;z++)
{
memset(dis,0,sizeof(dis));
dis[0]=dist(d[0][i].x,d[0][i].y,d[1][j].x,d[1][j].y);
dis[1]=dist(d[1][j].x,d[1][j].y,d[2][k].x,d[2][k].y);
dis[2]=dist(d[2][k].x,d[2][k].y,d[3][z].x,d[3][z].y);
dis[3]=dist(d[3][z].x,d[3][z].y,d[0][i].x,d[0][i].y);
dis[4]=dist(d[0][i].x,d[0][i].y,d[2][k].x,d[2][k].y);
dis[5]=dist(d[1][j].x,d[1][j].y,d[3][z].x,d[3][z].y);
sort(dis,dis+6);
if (dis[0]==dis[1] && dis[1]==dis[2] && dis[2]==dis[3] && dis[3]==dis[0] && 2*dis[0]==dis[5] && dis[5]==dis[4] && dis[0])
ans=min(ans,i+j+k+z);
}
}
if (ans==16) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}
【CODEFORCES】 C. Captain Marmot的更多相关文章
- 【BZOJ4152】The Captain(最短路)
[BZOJ4152]The Captain(最短路) 题面 BZOJ Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求 ...
- 【Codeforces】Round #491 (Div. 2) 总结
[Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...
- 【Codeforces】Round #488 (Div. 2) 总结
[Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...
- 【CodeForces】601 D. Acyclic Organic Compounds
[题目]D. Acyclic Organic Compounds [题意]给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n&l ...
- 【Codeforces】849D. Rooter's Song
[算法]模拟 [题意]http://codeforces.com/contest/849/problem/D 给定n个点从x轴或y轴的位置p时间t出发,相遇后按对方路径走,问每个数字撞到墙的位置.(还 ...
- 【CodeForces】983 E. NN country 树上倍增+二维数点
[题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...
- 【CodeForces】925 C.Big Secret 异或
[题目]C.Big Secret [题意]给定数组b,求重排列b数组使其前缀异或和数组a单调递增.\(n \leq 10^5,1 \leq b_i \leq 2^{60}\). [算法]异或 为了拆位 ...
- 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块
[题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...
- 【CodeForces】906 D. Power Tower 扩展欧拉定理
[题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...
随机推荐
- 洛谷 P2678 跳石头【经典二分答案/贪心】
题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 NN 块岩石(不含起点和终点的岩石).在比赛过程中,选手们将从 ...
- 使用Nginx+uWSGI部署Django项目
1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgi l ...
- Python中类方法重载---大部分
重载方法格式: def __xxx__(self,other): ... 注:重载方法格式------------------------------------------------------- ...
- 关于两数的最大公约数gcd
深根半夜里研究C++的语法,在弄到关于函数的定义 这一部分时突然想写个试试,就拿比较熟悉的gcd来好了. 活这么久gcd一直是用辗转相除法(或者说欧几里得算法)得出的,根据<算法导论>第三 ...
- [51nod1538]一道难题
先观察一下题目给出的式子:对所有满足$\begin{align*}\sum\limits_{i=1}^na_ib_i=m\end{align*}$的$b_{1\cdots n}$,计算$\begin{ ...
- 【计算几何】【极角序】【二分】bzoj1914 [Usaco2010 OPen]Triangle Counting 数三角形
极角排序后枚举每个点,计算其与原点连线的左侧的半平面内的点与其组成的三角形数(二分/尺取),这些都不是黄金三角形. 补集转化,用平面内所有三角形的个数(C(n,3))减去这些即可. 精度很宽松,几乎不 ...
- webstorm 2016
2017.2.27更新 选择“license server” 输入:http://idea.imsxm.com/ 2016.2.2 版本的破解方式: 安装以后,打开软件会弹出一个对话框:选择“lice ...
- 两道Java面试题!
body { font-family: 微软雅黑; font-size: 14px; line-height: 2; } html, body { color: inherit; background ...
- Git学习笔记(一) 安装及版本库介绍
安装Git 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和 ...
- MathType输入矩阵或者向量的注意事项
如图A区域是换行搞得,BC是插入矩阵,AC明显看着不一样,就是说行间不要使用换行,列间隔不要用空格(ctrl+shift+space),直接插入矩阵,向量就是矩阵的行或者列数目是1. 还有就是需要注意 ...