我认为这道题有三个难点:
1.怎样更加简便的实现点的存取,我们可以将点设计成一个类;
2.怎样算多边形的面积,我采用的是海伦公式;
3.一般人都会想到将多边形分成三角形来将面积求和,这里的难点就是要注意这并不是一个规则的多边形,所以要考虑多边形的凹凸性,我采用了判断斜率大小的方法来判断当前所计算的三角形的面积是否是多边形的一部分,即判断它的凹凸性。
修改多次,最终AC了,新手所以代码不够简洁。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext())
{
int n=sc.nextInt();
if(n==0)
{
break;
}
if(n>=3 && n<=100)//不要忘记题目对n的限定条件
{
List<P> a=new ArrayList<P>();
for(int i=0;i<n;i++)
{
double x=sc.nextDouble();
double y=sc.nextDouble();
a.add(new P(x,y));//将点这个对象存进去
}
double ans = 0;
for(int i=1; i<n-1; i++) {
double x=a.get(i).sub(a.get(0));//最初点和第i-1个点的连线长度
double y=a.get(i+1).sub(a.get(0));//最初点和第i个点的连线长度
double z=a.get(i).sub(a.get(i+1));//第i-1个和第i个点的连线长度
double s=(x+y+z)/2;//三角形的半周长
double q=Math.sqrt(s*(s-x)*(s-y)*(s-z));//海伦公式
if(a.get(0).juge(a.get(i), a.get(i+1))==1)//判断凹凸性
{
ans += q;//若为凸则加上这个三角形的面积
}
else
{
ans-=q;//若为凹则减去这个三角形的面积
//之所以要减去是因为计算下一个为凸的三角形的面积时会将这个三角形的面积包括进去,可以自己举个例子画个图就很清楚了
}
}
System.out.printf("%.1frn", ans );//按照格式输出
}
}
sc.close();
}
}
class P
{
double x;
double y;
public P(double x,double y)
{
this.x=x;
this.y=y;
}
public double sub(P p) {
// 求当前点和指定点的连线长度
double m=this.x-p.x;
double n=this.y-p.y;
double s= Math.sqrt(m*m+n*n);
return s;
}
public int juge(P p,P m)
{
//求当前点和另外两点所组成的三角形的凹凸
double k=(this.y-p.y)/(this.x-p.x);
double g=(m.y-this.y)/(m.x-this.x);
if(k<=g)
{
return 1;
}
else
{
return -1;
}
}
}