題目是這樣的:

oj總是給我的case5-9判wa,我實在找不出問題了,才來求教的,謝謝!!!面積是用向量叉乘算的。
import java.util.*;
public class Main {
public static double Area(double a,double b,double c,double d,double e,double f) {
double A = Math.sqrt((b*f-c*e)*(b*f-c*e) + (a*f-c*d)*(a*f-c*d) + (a*e-d*b)*(a*e-d*b))/2;
return A;
}
public static double max(double[]A) {
double x =0;
for(int i=0;i<A.length;i++ )
{if(x < A[i])
{x = A[i];}
}
return x;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
/*------------------------------------Get the points---------------------------------------------*/
double [][]P = new double [n][3];
double [] A = new double [n];
{for(int i=0;i<n;i++)
{for(int j=0;j<3;j++)
{P[i][j] = in.nextDouble();
if (P[i][j] > 1000000||P[i][j] <- 1000000)
{break;}}
}
/*------------------------------------Get the points---------------------------------------------*/
/*-------------------------------------Get the Area----------------------------------------------*/
if (n <=2|| n > 1000)
{System.out.print("");}
else
{for (int i=0;i<n;i++){
for (int j=i+1;j<n;j++) {
for (int k=j+1;k<n;k++)
{A[i] = Area(P[i][0]-P[j][0],P[i][1]-P[j][1],P[i][2]-P[j][2],P[j][0]-P[k][0],P[j][1]-P[k][1],P[j][2]-P[k][2]);}
}}
if (max(A) !=0)
{System.out.printf("%.2f", max(A));}
else
{System.out.print("");}
}}
in.close();}
}
uj5u.com熱心網友回復:
你代碼里沒有判斷三點共線,構不成三角形的情況啊uj5u.com熱心網友回復:
給你寫個例子,你自己參考吧從給出的點集合里選三個點,判斷能否組成三角形,如果可以則計算面積
public class Sample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n < 3) return; //如果頂點小于3個點,則肯定夠不成三角形
int points[][] = new int[n][3];
for (int i=0; i<n; i++) { //輸入頂點
points[i][0] = sc.nextInt();
points[i][1] = sc.nextInt();
points[i][2] = sc.nextInt();
}
double max = select(points); //核心部分
if (max > 0.0) { //如果能構成三角形,則面積必大于0
System.out.printf("%.2f\n", max);
}
}
public static double select(int[][] points) { //選出所有3個點的組合,并判斷能否構成三角形,如果可以則計算面積,并保存最大面積
int[] idx = new int[3]; //頂點下標
for (int i=0; i<idx.length; i++) {
idx[i] = I; //初始化選出的3個頂點,即最開始選則下標為0,1,2的頂點
}
double max = 0.0;
while (idx[0] < points.length - 2) {
double tmp = getArea(points[idx[0]], points[idx[1]], points[idx[2]]); //求出面積(如果構不成三角形則回傳0)
if (max < tmp) {
max = tmp; //保存最大面積
}
idx[idx.length-1]++; //排列組合選下一組3個頂點
while (idx[idx.length-1]>=points.length && idx[0]<points.length-2) {
int i=idx.length-1;
for (; i>0; i--) {
if (idx[i] < points.length) {
break;
}
idx[i-1]++;
}
for (++i; i<idx.length; i++) {
idx[i] = idx[i-1] + 1;
}
}
}
return max;
}
public static double getArea(int[]... points) {
double area = 0.0;
double[] lines = new double[points.length];
for (int i=0; i<lines.length; i++) { //算出三邊的長
double x = points[i][0] - points[(i+1)%points.length][0];
double y = points[i][1] - points[(i+1)%points.length][1];
double z = points[i][2] - points[(i+1)%points.length][2];
lines[i] = Math.sqrt(x*x + y*y + z*z);
}
if (lines[0] + lines[1] > lines[2]
&& lines[0] + lines[2] > lines[1]
&& lines[1] + lines[2] > lines[0]) { //如果滿足三角形兩邊之和大于第三邊,則構成三角形,計算面積
area = (lines[0] + lines[1] + lines[2]) / 2.0;
area = Math.sqrt(area*(area-lines[0])*(area-lines[1])*(area-lines[2]));
}
return area;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/93213.html
標籤:Eclipse
上一篇:大哥大姐,來看看
