题目描述不好理解,但读懂之后就基本有思路了,记录上一个坐标时注意正负 #include<iostream> #include<cstdio> #include<cmath> using namespace std; double dis[1010]; int point[1010][2]; int main() { int i; int n, m, cou = 1, count; double len, aver, seg, x, y; //freopen("input.txt", "r", stdin); while(cin>>n>>m){ len = 0; count = 1; for(i = 0; i < n; i++){ cin>>point[i][0]>>point[i][1]; if(i == 0) dis[i] = sqrt(point[i][0] * point[i][0] + point[i][1] * point[i][1]); else dis[i] = sqrt((point[i][0] - point[i - 1][0]) * (point[i][0] - point[i - 1][0]) + (point[i][1] - point[i - 1][1]) * (point[i][1] - point[i - 1][1])); len += dis[i]; //cout<<dis[i]<<" "; } aver = len / (m + 1); seg = aver; //cout<<endl<<seg<<" "<<len<<endl; printf("Route %d/n", cou++); for(i = 0; i < n; i++){ while(dis[i] < seg){ seg -= dis[i]; i++; } if(i == 0){ x = y = 0; }else{ if(point[i - 1][0] <= point[i][0]) x = point[i - 1][0]; else x = -point[i - 1][0]; if(point[i - 1][1] <= point[i][1]) y = point[i - 1][1]; else y = -point[i - 1][1]; } //cout<<x<<" "<<y<<" "<<i<<endl; for(;;){ if(point[i][0] != x){ if(count > m) break; printf("CP%d: (%.3f, ", count++, fabs(seg * cos(atan(fabs((double)(point[i][1] - fabs(y)) / (double)(point[i][0] - fabs(x))))) + x)); printf("%.3f)/n", fabs(seg * sin(atan(fabs((double)(point[i][1] - fabs(y)) / (double)(point[i][0] - fabs(x))))) + y)); }else { if(count > m) break; printf("CP%d: (%.3f, %.3f)/n", count++, x, fabs(seg + y)); } seg += aver; if(dis[i] < seg) break; } seg = seg - dis[i]; } } return 0; }