杭电OJ2036

#include <iostream>
#include <vector>
#include <math.h>
#include <iomanip>
using namespace std;

/*多边形面积在计算机中有一个很好的处理办法就是相量叉乘,我们知道三角形OAB的面积可以等于1/2*|OA|*|OB|*sinAOB,也就是等于OAXOB的模
 *若A(x1,y1),B(x2,y2),那么S=(x1*y2-x2*y1) / 2(若不除以2算的是平行四边形的面积)(选择坐标原点为O点),
 *由此就可以求得三角形的面积(由于叉乘有正负,可处理凹多边形的情况) 
*/

struct point{
	int x;
	int y;
};

int main(){
	int n;
	vector<point> p;
	point temp;
	double area;
	while(cin >> n){
		p.clear();
		area = 0.0;
		if(n == 0){
			break;
		}
		else{
			for(int i = 0; i < n; i++){
				cin >> temp.x;
				cin >> temp.y;
				p.push_back(temp);
			}
		}
		for(int i = 0; i < p.size() - 1; i++){
			area += 0.5*(p[i].x * p[i+1].y - p[i+1].x * p[i].y);
		}
		area += 0.5*(p[p.size()-1].x * p[0].y - p[0].x * p[p.size()-1].y);//最后一组要加上 p[p.size()1-1]不是p[p.size()] !!
		cout<<setiosflags(ios::fixed)<<setprecision(1);
		area = area >= 0 ? area: -area;
		cout << area << endl; 
	}
	return 0;
}



//===================================================================

//WA,递归求凸多边形面积,将多边形分成多个小三角形求解(只适用于凸多边形),求凸多边形时也可不用递归,按顶点0,1,2  0,2,3  0,3,4   讲每个小三角形加上即可

/*
#include <iostream>
#include <vector>
#include <math.h>
#include <iomanip>
using namespace std;

struct point{
	int x;
	int y;
};

double cal_area(vector<point> po){//递归求多边形面积 
	double area = 0;
	double a = 0, b = 0, c = 0, p = 0;
	if(po.size() == 3){//递归出口,将多边形切割成多个小三角形求面积 , 只适用于凸多边形 
		a = sqrt( (po[0].x - po[1].x)*(po[0].x - po[1].x) + (po[0].y - po[1].y)*(po[0].y - po[1].y) );
		b = sqrt( (po[1].x - po[2].x)*(po[1].x - po[2].x) + (po[1].y - po[2].y)*(po[1].y - po[2].y) );
		c = sqrt( (po[0].x - po[2].x)*(po[0].x - po[2].x) + (po[0].y - po[2].y)*(po[0].y - po[2].y) );
		p = (a + b + c) / 2;
		area = sqrt(p * (p - a) * (p - b) * (p - c));
		return area;
	}
	else{
		int div;
		div = po.size() / 2;
		
		vector<point> t1;
		vector<point> t2;
		
		t1.clear();
		t2.clear();
	
		for(int i = 0; i <= div; i++){
			t1.push_back(po[i]);
		}
		
		for(int i = div; i < po.size(); i++){
			t2.push_back(po[i]);
		}

		t2.push_back(po[0]);
		return cal_area(t1) + cal_area(t2);
	}
}

int main(){
	int n;
	vector<point> p;
	point temp;
	double area;
	while(cin >> n){
		p.clear();
		if(n == 0){
			break;
		}
		else{
			for(int i = 0; i < n; i++){
				cin >> temp.x;
				cin >> temp.y;
				p.push_back(temp);
			}
		}
		area = cal_area(p);
		cout<<setiosflags(ios::fixed)<<setprecision(1);
		cout << area << endl;
		
	}
	return 0;
}
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
杭电oj是杭州电子科技大学开发的一个在线评测系统,主要用于计算机考研的教育辅助工具。对于计算机考研的学生来说,杭电oj提供了一个良好的平台,可以进行编程练习和算法训练,帮助学生提升编程能力和算法水平。 首先,杭电oj上有大量的目库,涵盖了计算机考研的各个方面,比如数据结构、算法设计、数据库等,学生可以根据自己的需要选择相应的目进行练习。目难度分级明确,从简单到困难,适合不同水平的学生进行练习。通过解训练,学生可以熟悉各类算法思想和程序设计方法,提高解能力。 其次,杭电oj提供了在线评测系统,可以帮助学生及时了解自己的编程能力和代码水平。在解答目后,杭电oj会自动评判答案的正确性和效率,以及输出格式是否正确。学生可以根据评测结果对自己的代码进行优化和改进,提高编程的正确性和效率。 此外,杭电oj还提供了讨论区功能,学生可以与其他考研学生进行交流和讨论。在讨论区里,学生可以提问、回答问,分享解思路和经验,相互学习和进步。通过互助学习,学生可以更好地理解和掌握各类算法和编程知识,提高解的能力和效率。 总的来说,杭电oj对于计算机考研的学生是一个非常有用的教育辅助工具,它提供了库、评测系统和讨论区,能够帮助学生提升编程能力和算法水平,提高解能力和效率。对于计算机考研的学生来说,积极利用杭电oj进行练习和学习,能够有效地提高自己的竞争力和通过考研的概率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值