定义
-
曼哈顿距离
对于一个具有正南正北正东正西方向规则布局的地图来说,从一点到达另一点的距离正是在南北方向上移动的距离加上在东西方向上移动的距离,因此,曼哈顿距离又称为出租车距离。简称为:两个点在标准坐标系上的绝对轴距总和。也就是说曼哈顿距离指的就是从一个点沿着东南西北(即沿着横轴纵轴)移动到另一个点的最短路径长度。
如图,这是从点A到点B的两条曼哈顿距离:
若在某个多维数组中,两个点间没有障碍物,大多数时候可以用曼哈顿距离来代替广搜的得到的距离。
-
欧氏距离
欧式距离,全称欧几里得度量,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离(也就是连接这两点的线段)。以下分别是二维和三维是点A到点B的欧式距离的示意图。
![]()
在求最短距离时,我们往往都是求的欧式距离。
公式
备注:x1、x2分别指点A的横坐标和纵坐标,y1、y2分别指点B的横坐标和纵坐标。
-
曼哈顿距离
MD=|x1-y1|+|x2-y2|-1(减一是因为有一个重复的点)
-
欧式距离
二维:EM=sqrt((x1-x2)^2+(y1-y2)^2)
代码实现
说明:代码求的是在输入的m行n列(2=<m,n<=50)图('.'表示空地)中A到B的(曼哈顿||欧式)距离(欧式距离保留6位小数)。
-
曼哈顿距离
C++:
#include<cmath> #include<iostream> using namespace std; int m,n; string map[50]; int main() { cin>>m>>n; for(int i=0;i<m;i++) cin>>map[i]; for(int i=0;i<m;i++) for(int j=0;j<n;j++) for(int k=0;k<m;k++) for(int h=0;h<n;h++) if(map[i][j]=='A'&&map[k][h]=='B') { cout<<fabs(i-k)+fabs(j-h)-1<<endl; return 0; } }
C:
#include<stdio.h> #include<stdlib.h> #include<math.h> int m,n; char map[51][51]; int main() { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) scanf("%s",map[i]+1); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) for(int k=1;k<=m;k++) for(int h=1;h<=n;h++) if(map[i][j]=='A'&&map[k][h]=='B') { printf("%d\n",abs(i-k)+abs(j-h)-1); system("pause"); return 0; } system("pause"); return 0; }
-
欧式距离
C++:
#include<cmath> #include<iostream> using namespace std; int m,n; string map[50]; int main() { cin>>m>>n; for(int i=0;i<m;i++) cin>>map[i]; for(int i=0;i<m;i++) for(int j=0;j<n;j++) for(int k=0;k<m;k++) for(int h=0;h<n;h++) if(map[i][j]=='A'&&map[k][h]=='B') { cout.flags(ios::fixed); cout.precision(6); cout<<(double)sqrt((i-k)*(i-k)+(j-h)*(j-h))<<endl; return 0; } }
C:
#include<stdio.h> #include<stdlib.h> #include<math.h> int m,n; char map[51][51]; int main() { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) scanf("%s",map[i]+1); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) for(int k=1;k<=m;k++) for(int h=1;h<=n;h++) if(map[i][j]=='A'&&map[k][h]=='B') { printf("%.6lf\n",sqrt((i-k)*(i-k)+(j-h)*(j-h))); system("pause"); return 0; } system("pause"); return 0; }