題目:
時間限制 : 1 Sec
內存限制 : 32 Mb
提交 : 943
解決 : 253
題目描述
小 X 最近對戰勝韓國圍棋大神李世石的 AlphaGo 很感興趣,所以小 X 自己寫了一個叫 做 BetaGo的人工智能程序(簡稱 AI) , 這個 BetaGo 會做什么呢?
小 X 首先想要讓 BetaGo 做到自己在棋盤上落子, 這一點 AlphaGo 是由程序員來完成的。小 X 的設想是這樣的: 在棋盤的邊框上放置一個小機器人, 這個小機器人會沿着棋盤的邊框移動到最接近落子點的位置,然后伸出它的機械臂將棋子放到棋盤上。 這里面最關鍵的一步是如何讓小機器人在棋盤的邊框上沿着最短的路徑移動,小 X 想請你幫他編個程序解決這個問題。
眾所周知,圍棋棋盤大小為 19 × 19(如下圖所示) , 圖中加粗的一圈即為邊框。

我們用一對整數 (x, y) 來表示棋盤上第 x 條橫線(從下往上數)與第 y 條豎線(從左往右數)的交叉點,如上圖中邊框上的 A 點用( 6, 1) 表示, B 點用 (10, 19) 表示,小機器人初始時放置在 (x1,y1) 這個位置上, 它想要移動到 (x2, y2) 這個位置上。 (x1, y1) 和(x2, y2) 一定是棋盤邊框上的交叉點每一步小機器人可以從當前位置移動到相鄰(上下左右)的某個位置上, 即每次可以從 (x, y) 移動到 (x - 1, y) 、 (x + 1, y) 、 (x, y - 1) 、 (x, y + 1) 四個位置中的一個, 但是它不能走出或走進棋盤,也就是說它只能沿着棋盤的邊框移動到相鄰位置, 這就意味着任一時刻相鄰位置都恰好只有兩個。
BetaGo 會告訴小機器人最少需要走多少步, 但小 X 還是很擔心 BetaGo 有的時候會失控,從而告訴他一個錯誤值。
為此小 X 只好求助你, 希望你編一個程序計算從 (x1, y1) 沿着棋盤的邊框移動到 (x2, y2) 最少需 要 走 多 少步 。 上 圖 中 從 A 點 ( 6 , 1 ) 移 動 到 B 點 (10 , 19) 最 少需 要 走 32 步 , 移 動 路線 是 :( 6 , 1 ) → ( 5 , 1 ) → ( 4 , 1 ) → ( 3 , 1 ) → ( 2 , 1 ) → ( 1 , 1 ) → (1 , 2 ) → (1 , 3 ) →……→(1, 19) →(2, 19) →……→(10, 19)
輸入
輸入數據僅有一行包含四個用空格隔開的正整數表示 x1, y1, x2, y2。
數據保證 (x1, y1) , (x2, y2) 一定是棋盤邊框上的交叉點。
輸出
輸出一行包含一個整數 ans, 表示小機器人從 (x1, y1) 移動到 (x2, y2) 的最少步數。
樣例輸入
6 1 10 19
樣例輸出
32
【數據范圍】
對於 30%的數據, (x1, y1) , (x2, y2) 在同一條邊框上
對於另外 30%的數據, (x1, y1) , (x2, y2) 在相鄰的兩條邊框上
對於另外 40%的數據, (x1, y1) , (x2, y2) 在相對的兩條邊框上
【友情提醒】
在計算機語言中, 絕對值函數常記作 abs(x) , 絕對值函數的值一定大於等於 0, 其意義為 x 到 0的距離,如 3 到 0 的距離為 3, -3 到 0 的距離也是 3,所以 abs(3) =abs(-3) =3,一般地有 abs(x1-x2) =abs(x2-x1) =x1 到 x2 的距離。
方法:
1、三種情況:
(1)對面兩個點【要分兩路比較】
(2)相鄰直線上的兩個點【(x橫坐標y縱坐標)abs(x1-x2)+abs(y1-y2)】
(3)同一條線上【判斷,abs(x1-x2)或abs(y1-y2)]
標程:
#include<bits/stdc++.h>
using namespace std;
int a1,a2,b1,b2,ss,sy;
int main()
{
cin>>a1>>a2>>b1>>b2;
if (abs(a1-b1)==18)
{
ss=18+a2-1+b2-1;
sy=18+19-a2+19-b2;
}
if (abs(a2-b2)==18)
{
ss=18+a1-1+b1-1;
sy=18+19-a1+19-b1;
}
if (a1==b1)ss=abs(a2-b2);
if (a2==b2)ss=abs(a1-b1);
if (ss+sy==0)ss=abs(a1-b1)+abs(a2-b2);
if ((ss>sy)&&(sy!=0))
{
cout<<sy;
}
else cout<<ss;
return 0;
}
using namespace std;
int a1,a2,b1,b2,ss,sy;
int main()
{
cin>>a1>>a2>>b1>>b2;
if (abs(a1-b1)==18)
{
ss=18+a2-1+b2-1;
sy=18+19-a2+19-b2;
}
if (abs(a2-b2)==18)
{
ss=18+a1-1+b1-1;
sy=18+19-a1+19-b1;
}
if (a1==b1)ss=abs(a2-b2);
if (a2==b2)ss=abs(a1-b1);
if (ss+sy==0)ss=abs(a1-b1)+abs(a2-b2);
if ((ss>sy)&&(sy!=0))
{
cout<<sy;
}
else cout<<ss;
return 0;
}