题目描述
在一个矩阵精灵王国里有两个精灵,一个叫黑精灵,一个叫白精灵。他们住在一个 N × M N\times M N×M的矩阵方格中的不同位置,黑精灵住在矩阵方格的左上角(1,1),白精灵住在矩阵方格的右下角方格里(N,M)。
在这个矩阵方格例还有一对可穿越的们,这对穿越门的位置不固定,位置可变换(穿越门不会出现在矩阵方格左上角和右下角位置,也不会重叠出现,有且只有一对)。穿越门的功能是当进去其中一扇门的位置后可直接穿越到另一扇门的位置。如下图所示:
一天黑精灵要去白精灵家做客,需要穿过方格矩阵到达白精灵家,穿行矩阵方格要求:
- 1.每次只能走一个方格,可以向上、向下、向左、向右行走;
- 2.每走一个方格记为一步,但从一扇门穿越到另一扇门穿越门不记步数(从方格走到穿越门和从穿越门到其他方格都计1步);
- 3.可借助穿越门去白精灵家(可减少行走步数)。
为了尽快到达白精灵加,请你帮助黑精灵找一条最短路线,并且计算出最短路线的步数。
例如上图中给出一个3*4的矩阵方格,并给出第一个穿越门的坐标位置N1,M1(2,3),第二个穿越门的坐标位置N2,M2(3,1),已知黑精灵初始坐标位置左上角(1,1),白精灵坐标位置右下角(N,M)。按照穿行矩阵方格要求为左上角方格的黑精灵到右下角方格白精灵家找一条最短路线,计算出最短路线的步数:
路线:从黑精灵初始位置(1,1)到正下方方格(2,1)走1步,正下方方格(2,1)到其下方穿越门(3,1)走1步,然后穿越到另一扇穿越门(2,3)向正下方(3,3)走1步,最后到大白精灵家(3,4)需要走1步,故最短路线需要4步。
输入格式
第一行输入两个以一个空格隔开的正整数 N N N( 2 < N < 101 2<N<101 2<N<101), M M M( 2 < M < 101 2<M<101 2<M<101),分别表示 N N N行 M M M列的方格矩阵;
接下来第二行输入两个以一个空格隔开的正整数: N 1 N1 N1( N 1 < = N N1<=N N1<=N), M 1 M1 M1( M 1 < = M M1<=M M1<=M),代表第一个穿越门位于第 N 1 N1 N1行第 M 1 M1 M1列;
接下来第三行输入两个以一个空格隔开的正整数: N 2 N2 N2( N 2 < = N N2<=N N2<=N), M 2 M2 M2( M 2 < = M M2<=M M2<=M),代表第二个穿越门位于第 N 2 N2 N2行第 M 2 M2 M2列;
注意:两个穿越门位置不能重叠,即不能同时满足 N 1 = N 2 N1=N2 N1=N2和 M 1 = M 2 M1=M2 M1=M2;两个穿越门位置也不能位于左上角(1,1)和右下角(M,N);第一个穿越门位置要在第二个穿越门前边或者上边。
输出格式
输出一个整数,表示黑精灵去白精灵家最短路线需要走多少步(可借助穿越门,减少步数)。
输入样例
3 4
2 3
3 1
输出样例
4
算法思想(曼哈顿距离)
因为通过魔法门的代价为0,所以从起点出发、通过魔法门、然后再到达终点的代价一定小于不经过魔法门的情况。因此可以用两个魔法门所在位置为起点,分别计算到达白精灵和黑精灵家的曼哈顿距离,它们的和就是通过传送门从黑精灵去白精灵家最短路线需要走的步数。
注意:由于不确定哪个传送门离白精灵或黑精灵家更近,因此,需要求两次距离,取最小值即可。
代码实现
#include <iostream>
using namespace std;
int main()
{
int n, m, n1, m1, n2, m2;
cin >> n >> m >> n1 >> m1 >> n2 >> m2;
int ans1 = (n1 - 1 + m1 - 1) + (n - n2 + m - m2);
int ans2 = (n2 - 1 + m2 - 1) + (n - n1 + m - m1);
cout << min(ans1, ans2) << endl;
return 0;
}