AOJ-AHU-OJ-661 跨越千山万水只为找到你

跨越千山万水只为找到你
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
Description
在一个二维平面上,有n条直线和不重叠的两个点(点S,点T,数据保证S和T一定不在n条直线中的任何一条上)。问:从点S到点T最少需要跨越多少条直线?
注:题目有多组数据。

Input
第1行:测试数据组数t;
接下来依次是这t组数据,对于每一组数据:
第1行:n,0<n≤512;
第2行:Sx Sy Tx Ty,其中(Sx,Sy)是点S的坐标,(Tx,Ty)是点T的坐标;
第3~n+2行:x0 y0 x1 y1,点(x0,y0)和点(x1,y1)不重合,这两点表示一条直线;
第n+4行:空行。
上述数据中除n为整数外,都为实数,各数的绝对值大小不超过10 6

Output
一共t行,第i行对于第i组数据的答案。

Sample Input
Original Transformed
2
1
0 1 0 -1
-1 0 1 0

2
1 1 -1 -1
0 1 0 -1
-1 0 1 0


Sample Output
Original Transformed
1
2


Source
安徽大学第六届程序设计竞赛网络赛

————————————————————忧桑的分割线————————————————————
思路:数学问题。某点坐标代入一条直线,结果的正负反应它在直线的上侧还是下侧。两点代入之后相乘为负,在相反侧。(公式化简之后会WA,大概是因为浮点数的精度问题)
代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define JUD(y, x) ((y-y0)*(x1-x0) - (y1-y0)*(x-x0))
int main(){
    int cas;
    int line, ans;
    float sx, sy, tx, ty;
    scanf("%d", &cas);
    while(cas--){
        float x0, y0, x1, y1;
        scanf("%d", &line);
        ans = 0;
        scanf("%f%f%f%f", &sx, &sy, &tx, &ty);
        for(int i = 0; i < line; i++) {
            scanf("%f%f%f%f", &x0, &y0, &x1, &y1);
            if(JUD(sy, sx) * JUD(ty, tx) < 0)
                ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值