zoukankan      html  css  js  c++  java
  • 1186: 零起点学算法93——改革春风吹满地(C)

    一、题目

    http://acm.wust.edu.cn/problem.php?id=1186&soj=0

    二、分析

    1. 多组输入,‘0’结束;
    2. 顶点的个数在3至100之间;
    3. 一定顺序输入坐标;
    4. 坐标为int型整数;
    5. 多边形面积计算有两种思路:方法A:切成三角形,计算面积,再累加所有三角形面积;方法B:多边形面积公式

        参考链接:方法A方法B

        此处略加说明:

    方法A:已知三点坐标分别为:(x1,y1),(x2,y2),(x3,y3)。三角形面积为:

    large S= frac{1}{2} left [ x_{1} left ( y_{2} - y_{3} 
ight ) + x_{2} left ( y_{3} - y_{1} 
ight ) + x_{3} left ( y_{1} - y_{2} 
ight ) 
ight ]

    方法B:坐标存储在x[100],y[100]。下标从0开始,则多边形面积为:

    large dpi{150} large S= frac {1}{2} [ egin{vmatrix} x_{0} & y_{0} \ x_{1} & y_{1} end{vmatrix} + egin{vmatrix} x_{1} & y_{1} \ x_{2} & y_{2} end{vmatrix} + cdots + egin{vmatrix} x_{n-2} & y_{n-2} \ x_{n-1} & y_{n-1} end{vmatrix} + egin{vmatrix} x_{n-1} & y_{n-1} \ x_{0} & y_{0} end{vmatrix} ]

     

    三、思路

    方法A:如图,有5个点的凸多边形,将它以第一个点为基准切割成3个三角形分别计算面积,并累加得到五边形的面积。5个点坐标依次为:(2,1),(0,2),(-2,1),(-1,-1),(1,-2)。

    1186:多边形
    图:1186

    方法B:顶点个数用n表示,为0退出。顶点个数最多100个,坐标可用两个int型一维数组x[100],y[100]存储。将点的坐标全部带入公式计算面积。

    备注:以上两种方法适用于所有多边形,包括凹多边形。

    四、代码

    方法A:

    #include<stdio.h>
    int main() {
    	int n, x1, y1, x2, y2, x3, y3;
    	float areaOfTriangle, areaOfPolygon; // 三角形面积,多边形面积
    	while (scanf("%d", &n) && n != 0) {
    		areaOfPolygon = 0;
    		scanf("%d%d%d%d", &x1, &y1, &x2, &y2); // 输入前2个点的坐标
    		for(n -= 2; n > 0; n--) {
    			scanf("%d%d", &x3, &y3);
                            // 计算三角形面积
    			areaOfTriangle = 0.5 * (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2));
    			areaOfPolygon += areaOfTriangle; // 加到多边形的面积中
    			x2 = x3; // 以便计算下一个三角形面积
    			y2 = y3;
    		}
    		printf("%.1f
    ", areaOfPolygon);
    	}
    	return 0;
    }
    

    方法B:

    #include <stdio.h>
    int main() {
    	int n, i, area, x[100], y[100];
    	while (scanf("%d", &n) && n != 0) {
    		for (i = 0; i < n; i++) {
    			scanf("%d%d", &x[i], &y[i]); // 输入所有坐标
    		}
    		for (area = 0, i = 0; i < n; i++) { // 初始化面积为0
    			area += (x[i] * y[(i + 1) % n] - y[i] * x[(i + 1) % n]); // 多边形面积公式
    		}
    		printf("%.1f
    ", 0.5*area); // 输出面积
    	}
    }

    五、截图

    数据1:3个点组成的三角形

    数据2:4个点组成的凹多边形

    数据3:5个点的凸多边形(图1186)

    1186:截图

     

     

     

     

  • 相关阅读:
    Delphi中创建一个可以改变大小的无边框窗口
    Delphi中让窗口关闭按钮无效的6种方法
    把人笑抽筋的签名
    Delphi中判断窗体最大化和最小化事件
    Delphi中窗体的帮助按钮上执行一个自定义的动作
    无法查询部门收支分析表
    Delphi中去掉限制窗体最小尺寸的Windows约束
    Delphi中在窗体标题栏画自定义文字
    调拨单等单据定位功能没有过滤条件
    Form中对象的引用
  • 原文地址:https://www.cnblogs.com/wowpH/p/11060850.html
Copyright © 2011-2022 走看看