2073:無限の道
タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=2073
方法:法則を探す
構想:これは私が水題の中で比較的にレベルのある問題だと思います.基本的な構想はまず1つの点ごとに次の点に移る法則を見つけます.法則は、縦座標が0であれば、次の点の横座標が0で、次の点の縦座標が現在の点の横座標+1で、現在の点の縦座標が0でなければ、横+1、縦-1です.注意データが与えられる場合、点の生成規則に厳格に従っているわけではありません.つまり、2つの点は必ずしも誰が前に誰が後ろにいるかではありません.そのため、考え方はその場を基準に、各点から遠点までの距離を求めます.このように、2つの距離が差をつけて絶対値を作ることで、順序の問題を避けることができます.
難点:いくつかの機能関数の作成には特に注意が必要です.
方法:法則を探す
構想:これは私が水題の中で比較的にレベルのある問題だと思います.基本的な構想はまず1つの点ごとに次の点に移る法則を見つけます.法則は、縦座標が0であれば、次の点の横座標が0で、次の点の縦座標が現在の点の横座標+1で、現在の点の縦座標が0でなければ、横+1、縦-1です.注意データが与えられる場合、点の生成規則に厳格に従っているわけではありません.つまり、2つの点は必ずしも誰が前に誰が後ろにいるかではありません.そのため、考え方はその場を基準に、各点から遠点までの距離を求めます.このように、2つの距離が差をつけて絶対値を作ることで、順序の問題を避けることができます.
難点:いくつかの機能関数の作成には特に注意が必要です.
#include
#include
#include
using namespace std;
int nextPx = 0;
int nextPy = 0;
double getDistance(int ax,int ay,int bx,int by)
{
return sqrt((double(ax)-double(bx))*(double(ax)-double(bx))+(double(ay)-double(by))*(double(ay)-double(by)));
}
void changePoint(int x,int y)
{
if(y == 0)
{
nextPx = 0;
nextPy = x+1;
}
else
{
nextPx = x+1;
nextPy = y-1;
}
//cout<";
}
double getSum(int x,int y)
{
double sum = 0.0;
if(x == 0 && y == 0)
return sum;
changePoint(0,0);
int prePx = 0;
int prePy = 0;
int flag = 0;
while(!(nextPx == x && nextPy == y))
{
//cout<>n)
{
while(n--)
{
cin>>ax>>ay>>bx>>by;
printf("%.3lf
",abs(getSum(ax,ay)-getSum(bx,by)));
}
}
}