杭电ACM 这题做完 我的大脑深呼吸了30秒啊!!!有木有可以想出简洁版的 讨论讨论吧
甜甜从小就喜欢画图画,最近他买了一支智能画笔,由于刚刚接触,所以甜甜只会用它来画直线,于是他就在平面直角坐标系中画出如下的图形:甜甜的好朋友蜜蜜发现上面的图还是有点规则的,于是他问甜甜:在你画的图中,我给你两个点,请你算一算连接两点的折线长度(即沿折线走的路线长度)吧。
Input
第一个数是正整数N(≤100)。代表数据的组数。
每组数据由四个非负整数组成x1,y1,x2,y2;所有的数都不会大于100。
Output
对于每组数据,输出两点(x1,y1),(x2,y2)之间的折线距离。注意输出结果精确到小数点后3位。
Sample Input
public static Scanner input=new Scanner(System.in);
public static float result=0;//思路,算出每个坐标到原点的距离,然后求出两者距离之差即最终距离
public static void main(String[] args) {
// 输入用户需要计算的坐标
System.out.println("Sample Input");
int x1=input.nextInt();
int y1=input.nextInt();
int x2=input.nextInt();
int y2=input.nextInt();
float wolk1=f(x1,y1,x1,y1);//第一个坐标到(0,0)的距离
result=0;
float wolk2=f(x2,y2,x2,y2);//第二个坐标到(0,0)的距离
//测试数据
System.out.println(wolk1);
System.out.println(wolk2);
result=0;//两点的距离就等于两个点分别到零的距离之差
if(wolk1>wolk2){
result=wolk1-wolk2;
}
else if(wolk1<WOLK2){
result=wolk2-wolk1;
}
else if(wolk1==wolk2){
result=0;
}
System.out.println("Sample Output");
System.out.println("4--->"+result);
}
public static float f(int x,int y,int m,int n){//表示它需要走的长度
if(x==0 && y==0){//如果已经是原点,那么就直接跳出递归 返回距离为0
return 0;
}
else if(y<x && x!=0){//如果纵坐标为0,横坐标不为0
y+=x;//将x的值赋给y;然后再进行下边的计算
}
if(y==1){//如果y=1时,即到了跳出递归的时候,
double num=Math.sqrt(2);
if(m!=0){//考虑到x不为零的情况
result=result+(float)(m*num);//如果x横坐标不等于零的时候,还要加上x倍的2的平方根
// System.out.println("2--->"+result);
}
result=result+1;//最后一步就到(0,0)
// System.out.println("3--->"+result);
return result;//返回结果
}
int num1=y*y+(y-1)*(y-1);//直线三角形的 斜线距离的平方
int num2=(y-1)*(y-1)+(y-1)*(y-1);//等腰三角形的斜线距离的平方
result+=Math.sqrt(num1)+Math.sqrt(num2);//平方根后相加的距离
System.out.println("1--->"+result);
x--;//横坐标--
y--;//纵坐标--
return f(x,y,m,n);
}
}
[ 本帖最后由 highness 于 2013-4-22 10:51 编辑 ]