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} \right ) + x_{2} \left ( y_{3} - y_{1} \right ) + x_{3} \left ( y_{1} - y_{2} \right ) \right ]

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

\large \dpi{150} \large S= \frac {1}{2} [ \begin{vmatrix} x_{0} & y_{0} \\ x_{1} & y_{1} \end{vmatrix} + \begin{vmatrix} x_{1} & y_{1} \\ x_{2} & y_{2} \end{vmatrix} + \cdots + \begin{vmatrix} x_{n-2} & y_{n-2} \\ x_{n-1} & y_{n-1} \end{vmatrix} + \begin{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\n", 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\n", 0.5*area); // 输出面积
	}
}

五、截图

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

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

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

1186:截图