acm 杭电 Delta-wave 1030

在每个三角形中间取一个点,并给他设置坐标(x, y),并在有边界的三角形之间用线把两个三角形的中心点相连,我们的任务就是不断缩短出发点和目的点之间的距离,每个点有都有三条路可走(忽略边界情况)。

 

 

#include #include double pi = acos(0.0) * 2; bool direc[2][6] = { true, false, true, false, true, false, false, true, false, true, false, true };//标志此点在该方向是否有线连通 double dest(double x1, double x2, double y1, double y2) //两点距离 { return sqrt((x1 - x2)*(x1 - x2)+(y1 - y2)*(y1 - y2)); } int get_line(int num) //所属行 { return ceil(sqrt(num)); } void get_pos(int num, double &x, double &y) //给点设坐标 { int line = get_line(num); int mid = (line*line + (line - 1)*(line - 1)+ 1)/ 2; x = (num - mid)* cos(pi / 6); y = 0 -(sin(pi / 6) + 1) * (line - 1); if((num + line)% 2 == 1) y += sin(pi / 6); } int min_step(int from, int to) { double x_from, y_from,//当前点位置 x_to, y_to,//目的点位置 x_try, y_try;//尝试点 get_pos(from, x_from, y_from); get_pos(to, x_to, y_to); int i = (from + get_line(from) + 1)% 2;//点连通情况下标 int step = 0;//步数 while(dest(x_from, x_to, y_from, y_to) > 0.001) {//当没有到达目的点时 for(int j=0; j<6; ++j) { if(direc[i % 2][j]) {//该方向是否有线连通 x_try = x_from + sin(pi / 3 * j); y_try = y_from + cos(pi / 3 * j);//尝试 if(dest(x_from, x_to, y_from, y_to) > dest(x_try, x_to, y_try, y_to)) {//找到一个点可以是距离缩短 x_from = x_try; y_from = y_try; break; } } } ++i; ++step; } return step; } int main() { int from, to; while(scanf("%d%d", &from, &to) != EOF) printf("%d/n", min_step(from, to)); return 0; }

你可能感兴趣的:(ACM)