蓝桥杯真题——三角形的面积

Posted 来玥方长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯真题——三角形的面积相关的知识,希望对你有一定的参考价值。

题目描述

平面直角坐标系中有一个三角形, 请你求出它的面积。

输入描述

第一行输入一个 T ,代表测试数据量.

每组测试数据输入有三行,每行一个实数坐标 (x,y) 代表三角形三个顶点。

1≤T≤10^3,   −10^5≤x,y≤10^5

输出描述

输出一个实数表示三角形面积。结果保留2位小数,误差不超过 10^(−2)

输入输出样例

示例 1

输入

2
0 1
1 0
1 1
0 0
1 1
2 2

输出

0.50
0.00

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

目录

前言

一、问题分析

二、计算技巧

三、代码

四、有缺点的示范

 总结


前言

        这是一道计算机几何基础题,难度为简单,但同样也会有很多人做错,绝大多数人的会存在的误区:

1. 使用传统的三角形面积求解公式:底*高/2

2. 使用向量,向量夹角求解

这样做的思路没错,但仅限于手工计算方便吧,使用计算机计算就会出现计算精度和误差的问题,从而导出输出结果错误。

对于数学能力比较好的人,掌握计算技巧,相信能很快就做出来了。


一、问题分析

一共有T个三角形,每个三角形都只知道三个顶点的坐标,需要分别计算各个三角形的面积并分行输出计算结果。

数据规模:T最大为10^3,坐标的范围为[-10^5,10^5],这个规模的数据可以放心计算,问题不大,完全可以很好的控制在1s内程序运行完成。

二、计算技巧

计算公式:

三个坐标点:(x1,y1),(x2,y2),(x3,y3)

面积 2S = Math.abs(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2);

S = S/2

是否有印象?这是我能想到最简单和最有效的计算公式了,忘记的小伙伴可以去百度温习一下这公式


三、代码

import java.util.Scanner;

public class Main 
  
    public static void main(String[] args) 
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        for(int i=0;i<N;i++)
          double x1 = scan.nextDouble();
          double y1 = scan.nextDouble();
          double x2 = scan.nextDouble();
          double y2 = scan.nextDouble();
          double x3 = scan.nextDouble();
          double y3 = scan.nextDouble();
          double S = Math.abs(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2);
          System.out.printf("%.2f",S/2);
          System.out.println();
        
        scan.close();
    

四、有缺点的示范

以下是一个输出结果不会完全正确的案例,计算方法和思路是没错的,你可以思考以下啥原因导致的部分错误,也就是部分用例可以运行通过。

import java.util.Scanner;

public class Main 
    public static void main(String[] args) 
        Scanner scan = new Scanner(System.in);
        //测试数据的组数
        int T = scan.nextInt();
        //3*T组三角形顶点的坐标  每三个坐标(x,y)为一个三角形
        int[][] a = new int[3*T][2];
        for(int i=0; i<3*T; i++)
          a[i][0] = scan.nextInt();
          a[i][1] = scan.nextInt();
        
        scan.close();

        //求三角形的面积 底d*高h/2
        for(int i=0; i<3*T; i += 3)
          //知道三个顶点坐标,使用向量求解三角形面积S = 1/2*|AB|*|AC|*sinx
        	//三个顶点  按顺序默认编号为A、B、C
          double ABx = a[i+1][0] - a[i][0];
          double ABy = a[i+1][1] - a[i][1];
          double ACx = a[i+2][0] - a[i][0];
          double ACy = a[i+2][1] - a[i][1];
          double AB = Math.sqrt( (ABx*ABx + ABy*ABy));
          double AC = Math.sqrt((ACx*ACx + ACy*ACy));
          double cosx = (ABx*ACx + ABy*ACy)/(AB*AC);
          double sinx = Math.sqrt((1-cosx*cosx));
          double S = 0.50*AB*AC*sinx;
          System.out.printf("%.2f\\n",S);
          
        
    

 总结

学习算法,对于数学学的好的人可以得心应手,逻辑思维能力很重要,掌握计算技巧,往往比暴力计算更有效和更省时

2015年第六届蓝桥杯 - 省赛 - Java大学B组 - A. 三角形面积

三角形面积

如【图1】所示。图中的所有小方格面积都是1。

那么,图中的三角形面积应该是多少呢?

请填写三角形的面积。不要填写任何多余内容或说明性文字。

Ideas

这道题跟2018年第九届蓝桥杯 - 国赛 - C/C++大学A组 - A. 三角形面积基本类似,可以直接建立一个坐标系,得到三点坐标,然后套公式就可以了。

Code

if __name__ == '__main__':
	(x1, y1), (x2, y2), (x3, y3) = (0, 8), (8, 6), (4, 0)
	print(0.5 * abs(x1 * y2 + x2 * y3 + x3 * y1 - x3 * y2 - x1 * y3 - x2 * y1))

Answer: 28

以上是关于蓝桥杯真题——三角形的面积的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯选拔赛真题07python杨辉三角形 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

蓝桥杯选拔赛真题18python三角形相切圆 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

蓝桥杯选拔赛真题18python三角形相切圆 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

蓝桥杯国赛真题07python杨辉三角形 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

蓝桥杯国赛真题07python杨辉三角形 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

2015年第六届蓝桥杯 - 省赛 - Java大学B组 - A. 三角形面积