首页 > 试题广场 >

魔法阵

[编程题]魔法阵
  • 热度指数:3894 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

小Q搜寻了整个魔法世界找到了四块魔法石所在地,当4块魔法石正好能构成一个正方形的时候将启动魔法阵,小Q就可以借此实现一个愿望。

现在给出四块魔法石所在的坐标,小Q想知道他是否能启动魔法阵


输入描述:
输入的第一行包括一个整数(1≤T≤5)表示一共有T组数据

每组数据的第一行包括四个整数x[i](0≤x[i]≤10000),即每块魔法石所在的横坐标

每组数据的第二行包括四个整数y[i](0≤y[i]≤10000),即每块魔法石所在的纵坐标


输出描述:
对于每组数据,如果能启动魔法阵输出“Yes”否则输出“No”。
示例1

输入

3
0022
0202
0156
1605
0077
0303

输出

Yes
Yes
No
import sys
T = sys.stdin.readline()
T = int(T.strip())
for _ in range(T):
    xs = sys.stdin.readline()
    ys = sys.stdin.readline()
    xs = xs.strip()
    ys = ys.strip()
    x = list(map(int,xs))
    y = list(map(int,ys))
    t = [(x[i],y[i]) for i in range(4)]
    t.sort()
    x01 = t[1][0] - t[0][0]
    x23 = t[3][0] - t[2][0]
    x02 = t[2][0] - t[0][0]
    y01 = t[0][1] - t[1][1]
    y13 = t[1][1] - t[3][1]
    y02 = t[0][1] - t[2][1]
#     print(t)
    if x01 == x23 and y13 == y02 and (x02 == y01 or x02 + y01 == 0):
        print("Yes")
    else:
        print("No")
发表于 2022-04-22 07:49:15 回复(0)
不知道为啥你们都搞得那么复杂,这道题直接用两条对角线向量的模相等且数量积为0来判定即可,题目的测试数据应该是确保了是按照abcd点的顺序输入的,即a为起点,b和c为以a为向量起点的相邻两条边的终点,d为以a为起点的对角线向量的终点。

def solve(xs, ys):
    ad = [xs[3]-xs[0], ys[3]-ys[0]]
    bc = [xs[2]-xs[1], ys[2]-ys[1]]
    
    if (ad[0] ** 2 + ad[1] ** 2) == (bc[0] ** 2 + bc[1] ** 2) and (ad[0] * bc[0] + ad[1] * bc[1] == 0):
        return True
    return False

T = int(input())
for i in range(T):
    xs = [int(item) for item in list(input())]
    ys = [int(item) for item in list(input())]
    if solve(xs, ys) == True:
        print('Yes')
    else:
        print('No')
	


发表于 2021-09-08 19:00:51 回复(0)

问题信息

上传者:小小
难度:
2条回答 6483浏览

热门推荐

通过挑战的用户

查看代码
魔法阵