中国移动通信研究院笔试题2

小B所在的公司正在开发一个网络游戏项目,他们需要解决场景中攻击双方的占位问题。根据场景设计,攻击双方可能位于某个四边形区域中。所有的攻击方沿直线方向,若攻击目标所在区域与攻击线有交点才能被击中。直线可以表达为Ax+by+C=0。
小B希望确定按指定参数发出的攻击时,给定的区域是否可能被击中。
输入
输入中有多组测试数据。每组测试数据的第一行包含四个空格分隔的整数A、B和C和N,(-210^9<=A, B, C<=210^9, 1 <=N<=106),表示直线方程的参数以及目标矩形区域的数量,保证A2+B^2>0。接下来有N行数据,每行包含8个空格分隔的整数“x1 y1 x2 y2 x3 y3 x4 y4”,表示目标四边形区域的定点坐标。
输出
对每组测试数据所代表的区域,若能够击中,则中单独的行中输出1,否则输出-1。

样例输入
0 1 0 1
-1 0 -1 0 1 0 1 0
1 -1 0 2
0 0 1 0 1 1 0 1
1 2 3 4 5 6 7 8
样例输出
1
1
-1

温馨提示
请尽量在全场考试结束10分钟前调试程序,否则由于密集排队提交,可能查询不到编译结果
点击“调试”亦可保存代码
编程题可以使用本地编译器,此页面不记录跳出次数

#!/bin/python
# -*- coding: utf8 -*-
def ZF(lst1,lst2):
    for lst in lst2:
        if ((lst1[0]*lst[0] + lst1[1]*lst[1] + lst1[2])*
            (lst1[0]*lst[2] + lst1[1]*lst[3] + lst1[2])*
            (lst1[0]*lst[4] + lst1[1]*lst[5] + lst1[2])*
            (lst1[0]*lst[6] + lst1[1]*lst[7] + lst1[2]))==0:
                continue
        if not (
                (lst1[0]*lst[0] + lst1[1]*lst[1] + lst1[2])>0 and 
                (lst1[0]*lst[2] + lst1[1]*lst[3] + lst1[2])>0 and
                (lst1[0]*lst[4] + lst1[1]*lst[5] + lst1[2])>0 and
                (lst1[0]*lst[6] + lst1[1]*lst[7] + lst1[2])>0):
            return False
        
        if  not ((lst1[0]*lst[0] + lst1[1]*lst[1]+ lst1[2])<0 and 
                 (lst1[0]*lst[2] + lst1[1]*lst[3] + lst1[2])<0 and
                 (lst1[0]*lst[4] + lst1[1]*lst[5] + lst1[2])<0 and
                 (lst1[0]*lst[6] + lst1[1]*lst[7] + lst1[2])<0):
           return False
    return True
lst1 = [1, -1, 0, 2]
lst2 = [[1 ,2, 3, 4, 5, 6, 7, 8]]
print(ZF(lst1,lst2))

猜你喜欢

转载自blog.csdn.net/weixin_38246633/article/details/83246680
今日推荐