一、题目

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)。三角形面积为:

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

三、思路

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


图: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: 零起点学算法93——改革春风吹满地(C)的更多相关文章

  1. Problem C: 零起点学算法93——矩阵转置

    #include<stdio.h> int main() { ][],b[][]; while(scanf("%d%d",&n,&m)!=EOF) { ...

  2. 1164: 零起点学算法71——C语言合法标识符(存在问题)

    1164: 零起点学算法71——C语言合法标识符 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 10 ...

  3. 1163: 零起点学算法70——Yes,I can!

    1163: 零起点学算法70--Yes,I can! Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: ...

  4. 1147: 零起点学算法54——Fibonacc

    1147: 零起点学算法54--Fibonacc Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 20 ...

  5. 1145: 零起点学算法52——数组中删数II

    1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 293 ...

  6. 1137: 零起点学算法44——多组测试数据输出II

    1137: 零起点学算法44--多组测试数据输出II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: ...

  7. 1136: 零起点学算法43——多组测试数据输出I

    1136: 零起点学算法43--多组测试数据输出I Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitted: ...

  8. 1135: 零起点学算法42——多组测试数据(求和)IV

    1135: 零起点学算法42--多组测试数据(求和)IV Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted ...

  9. 1134: 零起点学算法41——多组测试数据(a+b)III

    1134: 零起点学算法41--多组测试数据(a+b)III Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitt ...

随机推荐

  1. BZOJ3262陌上花开

    三维偏序的模板. 当然各种树套树都可以搞,这里用CDQ分治弄一下. 首先利用排序使第一维有序,然后利用cdq函数开始执行类似归并排序的操作,由于左区间的第一维一定小于右区间的第一维,所以我们在归并过程 ...

  2. Java核心复习——synchronized

    一.概念 利用锁机制实现线程同步,synchronized关键字的底层交由了JVM通过C++来实现 Java中的锁有两大特性: 互斥性 同一时间,只允许一个线程持有某个对象锁. 可见性 锁释放前,线程 ...

  3. [Andorid] 通过JNI实现kernel与app进行spi通讯

    CPU:RK3399 系统:Android 7.1 人脸识别的要求越来越高,因此主板增加了 SE 加密芯片,加密芯片通过 spi 接口与 CPU 通讯. 对于 kernel 层的代码,Linux 原始 ...

  4. 使用 Fiddler 抓取iPhone 的 HTTPS 请求

    Fiddler 是著名的 HTTP(S) 抓包工具,功能十分强悍.Fiddler 采用代理的方式进行抓包,所以使用范围就非常广泛,不仅可以在 PC 端使用,更可以在移动设备上使用. 要在 iPhone ...

  5. 计算机基础——Java笔记一

            电子管-晶体管 摩尔定律 18个月变一次       贝尔实验室 C语言是基础.芯片领域软件领域 机器语言 ——汇编语言——高级语言 (面向过程,面向对象)   基本的逻辑怎么用代码实 ...

  6. Java 关于日期加一天(日期往后多一天)

    1.原来Java的日期添加不像.NET的.Add: import java.util.Date ; Date date=new   Date();//取时间System.out.println(dat ...

  7. javaScript(拼写树形)+ajax请求,去后台查找数据

    第一步:页面加载完成时,利用jquery中的一函数,调用js方法,js方法,发送ajax请求,去后台查找父类权限集合,响应回来json格式的数据,对数据进行操作,往页面上添加内容 //页面初始化加载菜 ...

  8. 连接池大小调优 原创: ImportNew ImportNew 2017-06-07

    连接池大小调优 原创: ImportNew ImportNew 2017-06-07

  9. SQL-W3School-函数:SQL SUM() 函数

    ylbtech-SQL-W3School-函数:SQL SUM() 函数 1.返回顶部 1. SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM( ...

  10. SVG动画示例

    package com.loaderman.customviewdemo; import android.graphics.drawable.Animatable; import android.os ...