好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 lw2001 于 2020-2-15 21:40 编辑
有一张地图,上面有编号1,2,...,n^2是从外层至中心按顺时针方向螺旋排列的点,相邻的点对距离都是1,现在给出两个编号a、b,问两个编号所对应的点之间的最短距离是多少?
举例:
n=3
此图中,编号2和编号5的最短距离就是sqrt(1+4)= 2.236。
如n = 5的时候,地图上点位置如下:
如图中,编号5和 编号13的最短距离就是sqrt(16+16)= 5.657。
输入:
先输入一个T(T≤1000),表示数据组数。
接下来T行,每行包括3个正整数n,a,b(1≤n≤4500,1≤a,b≤n2)。
```
#include <stdio.h>
#include <math.h>
int main() {
int t;
int n;
scanf("%d",&t);
int a,b,c,d;
int n1,n2;
while (t--){
scanf("%d%d%d",&n,&n1,&n2);
int k=1;
for (int i = 0; i < n / 2 + 1; ++i) {
for (int j = i; j < n-i; ++j) {
if(k==n1){
a=i;
b=j;
} else if (k==n2){
c=i;
d=j;
goto ed;
}
k++;
}
for (int j = i+1; j < n-i; ++j) {
if(k==n1){
a=j;
b=n-i-1;
} else if (k==n2){
c=j;
d=n-i-1;
goto ed;
}
k++;
}
for (int j = n-i-1; j >i; --j) {
if(k==n1){
a=n-i-1;
b=j-1;
} else if (k==n2){
c=n-i-1;
d=j-1;
goto ed;
}
k++;
}
for (int j = n-i-1; j > i+1; --j) {
if(k==n1){
a=j-1;
b=i;
} else if (k==n2){
c=j-1;
d=i;
goto ed;
}
k++;
}
}
ed:
a-=c;
b-=d;
printf("%.3f\n",sqrt(a*a+b*b));
}
return 0;
}
```
想请教一下程序有什么好的优化方向吗?
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|