C. Captain Marmot
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

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.

Input

The first line contains one integer n (1 ≤ n ≤ 100),
the number of regiments.

The next 4n lines contain 4 integers xiyiaibi ( - 104 ≤ xi, yi, ai, bi ≤ 104).

Output

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).

Sample test(s)
input
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
output
1
-1
3
3
Note

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的更多相关文章

  1. 【BZOJ4152】The Captain(最短路)

    [BZOJ4152]The Captain(最短路) 题面 BZOJ Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求 ...

  2. 【Codeforces】Round #491 (Div. 2) 总结

    [Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...

  3. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...

  4. 【CodeForces】601 D. Acyclic Organic Compounds

    [题目]D. Acyclic Organic Compounds [题意]给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n&l ...

  5. 【Codeforces】849D. Rooter's Song

    [算法]模拟 [题意]http://codeforces.com/contest/849/problem/D 给定n个点从x轴或y轴的位置p时间t出发,相遇后按对方路径走,问每个数字撞到墙的位置.(还 ...

  6. 【CodeForces】983 E. NN country 树上倍增+二维数点

    [题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...

  7. 【CodeForces】925 C.Big Secret 异或

    [题目]C.Big Secret [题意]给定数组b,求重排列b数组使其前缀异或和数组a单调递增.\(n \leq 10^5,1 \leq b_i \leq 2^{60}\). [算法]异或 为了拆位 ...

  8. 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块

    [题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...

  9. 【CodeForces】906 D. Power Tower 扩展欧拉定理

    [题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...

随机推荐

  1. 51nod 1283 最小周长【注意开根号】

    1283 最小周长 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 一个矩形的面积为S,已知该矩形的边长都是整数,求所有 ...

  2. hdu6041

    hdu6041 题意 给出一个仙人掌. 如果一个无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过重复的结点的环. 求前 \(K\) 小生成树 . 分析 仙人掌中每个环中 ...

  3. Don't Be a Subsequence

    问题 F: Don't Be a Subsequence 时间限制: 1 Sec  内存限制: 128 MB提交: 33  解决: 2[提交] [状态] [讨论版] [命题人:] 题目描述 A sub ...

  4. java中Frame Jpanel等中间显示

    几种是窗口中间显示的方法: 1.Frame int windowWidth = frame.getWidth(); //获得窗口宽 int windowHeight = frame.getHeight ...

  5. [BZOJ2655]calc(拉格朗日插值法+DP)

    2655: calc Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 428  Solved: 246[Submit][Status][Discuss] ...

  6. CodeForces - 981G Magic multisets

    假设我们可以对每个位置快速维护一个数组,记录每个位置有哪些值是已经出现了的,哪些值是没有出现的,这样就可以决定修改的时候到底是 *2 还是 +1了. 但是很可惜,并不存在功能这么强大的数组,所以只能另 ...

  7. 【离线】【递推】【multiset】 Codeforces Round #401 (Div. 2) C. Alyona and Spreadsheet

    对询问按右端点排序,对每一列递推出包含当前行的单调不下降串最多向前延伸多少. 用multiset维护,取个最小值,看是否小于等于该询问的左端点. #include<cstdio> #inc ...

  8. 3.2常用类(java学习笔记)String与StringBuffer

    一.String String又称不可变字符序列. 我们看JDK源码中用于字符存储的数组有final修饰,final修饰变量就代表变量不能改变. 我们可以看API文档中对String的描述. Stri ...

  9. 输入格式MultipleInput

    MultipleInput输入格式允许一个job的输入为多个文件夹下的文件(也就是多路径输入),并且不同文件夹下的文件可以实现不同的map逻辑,不过貌似必须使用相同的reduce逻辑. http:// ...

  10. Sublime | 编辑工具Sublime的使用小结

    文章目录 Sublime Package & Usage MarkdownEditing MarkdownPreview Usage Key Bindings Setting (语法高亮和ma ...