순간을 성실히, 화려함보단 꾸준함을

Codeforces Raif Round 1 (Div. 1 + Div. 2) : A번 본문

알고리즘,SQL/codeforce 문제

Codeforces Raif Round 1 (Div. 1 + Div. 2) : A번

폭발토끼 2020. 10. 21. 09:32

codeforces.com/contest/1428/problem/A

 

Problem - A - Codeforces

 

codeforces.com

문제 : 쥐가 상자를 끌고 다닌다. 이때 항상 쥐는 상자의 인접한 위치에만 있을 수 있고 상자를 끌을 수 있다. 쥐는 1단위로 움직일 수 있다. 이때 상자의 초기 위치(x1,y1)이 주어지고 이를 목적 위치(x2,y2)에 옮기기 위해 최소로 움직이는 횟수를 구하면 된다.

예시) (1,1) - > (2,2) 로 옮긴다고 해보자 

1) 상자 (1,1) , 쥐(2,1) //init

2) 상자(2,1) , 쥐(3,1)

3) 상자(2,1) , 쥐(3,2)

4) 상자(2,1) , 쥐(2,2)

5) 상자(2,2) , 쥐(3,2) //end

그러면 4번의 움직임에 원하는 위치에 상자를 갖다 둘수 있다.

 

해설 : 결국 초기의 상자가 목적 위치와 평행한 선에 위치해 있지 않으면 무조건적으로 쥐는 방향전환이 필요하다.

방향 전환의 단위는 2 이다. 따라서 정답은 |x1-x2|+|y1-y2| + (방향전환이 필요시 2,아니면 x) 가 정답이 된다.

 

#include<bits/stdc++.h>
 
using namespace std;
using ll = long long;
 
void solve();
 
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
 
	int t;
	cin >> t;
	while (t--)
		solve();
	return 0;
}
void solve()
{
	ll x1, y1, x2, y2;
	cin >> x1 >> y1 >> x2 >> y2;
 
	ll ans = abs(x1 - x2) + abs(y1 - y2);
	if (x1 != x2 && y1 != y2)ans += 2;
	cout << ans << "\n";
}