https://www.acmicpc.net/problem/15686
๋ฌธ์
ํฌ๊ธฐ๊ฐ N×N์ธ ๋์๊ฐ ์๋ค. ๋์๋ 1×1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๋์์ ๊ฐ ์นธ์ ๋น ์นธ, ์นํจ์ง, ์ง ์ค ํ๋์ด๋ค. ๋์์ ์นธ์ (r, c)์ ๊ฐ์ ํํ๋ก ๋ํ๋ด๊ณ , rํ c์ด ๋๋ ์์์๋ถํฐ r๋ฒ์งธ ์นธ, ์ผ์ชฝ์์๋ถํฐ c๋ฒ์งธ ์นธ์ ์๋ฏธํ๋ค. r๊ณผ c๋ 1๋ถํฐ ์์ํ๋ค.
์ด ๋์์ ์ฌ๋ ์ฌ๋๋ค์ ์นํจ์ ๋งค์ฐ ์ข์ํ๋ค. ๋ฐ๋ผ์, ์ฌ๋๋ค์ "์นํจ ๊ฑฐ๋ฆฌ"๋ผ๋ ๋ง์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ด๋ค. ์ฆ, ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง์ ๊ธฐ์ค์ผ๋ก ์ ํด์ง๋ฉฐ, ๊ฐ๊ฐ์ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๋ ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ์ด๋ค.
์์์ ๋ ์นธ (r1, c1)๊ณผ (r2, c2) ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ |r1-r2| + |c1-c2|๋ก ๊ตฌํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ์ง๋๋ฅผ ๊ฐ๋ ๋์๋ฅผ ์ดํด๋ณด์.
0 2 0 1 0
1 0 1 0 0
0 0 0 0 0
0 0 0 1 1
0 0 0 1 2
0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ด๋ค.
(2, 1)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-1| + |1-2| = 2, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-5| + |1-5| = 7์ด๋ค. ๋ฐ๋ผ์, (2, 1)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 2์ด๋ค.
(5, 4)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-1| + |4-2| = 6, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-5| + |4-5| = 1์ด๋ค. ๋ฐ๋ผ์, (5, 4)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 1์ด๋ค.
์ด ๋์์ ์๋ ์นํจ์ง์ ๋ชจ๋ ๊ฐ์ ํ๋์ฐจ์ด์ฆ์ด๋ค. ํ๋ ์ฐจ์ด์ฆ ๋ณธ์ฌ์์๋ ์์ต์ ์ฆ๊ฐ์ํค๊ธฐ ์ํด ์ผ๋ถ ์นํจ์ง์ ํ์ ์ํค๋ ค๊ณ ํ๋ค. ์ค๋ ์ฐ๊ตฌ ๋์ ์ด ๋์์์ ๊ฐ์ฅ ์์ต์ ๋ง์ด ๋ผ ์ ์๋ ์นํจ์ง์ ๊ฐ์๋ ์ต๋ M๊ฐ๋ผ๋ ์ฌ์ค์ ์์๋ด์๋ค.
๋์์ ์๋ ์นํจ์ง ์ค์์ ์ต๋ M๊ฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋๋จธ์ง ์นํจ์ง์ ๋ชจ๋ ํ์ ์์ผ์ผ ํ๋ค. ์ด๋ป๊ฒ ๊ณ ๋ฅด๋ฉด, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์๊ฒ ๋ ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(2 ≤ N ≤ 50)๊ณผ M(1 ≤ M ≤ 13)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
๋์์ ์ ๋ณด๋ 0, 1, 2๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , 0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ ์๋ฏธํ๋ค. ์ง์ ๊ฐ์๋ 2N๊ฐ๋ฅผ ๋์ง ์์ผ๋ฉฐ, ์ ์ด๋ 1๊ฐ๋ ์กด์ฌํ๋ค. ์นํจ์ง์ ๊ฐ์๋ M๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 13๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ ์ํค์ง ์์ ์นํจ์ง์ ์ต๋ M๊ฐ๋ฅผ ๊ณจ๋์ ๋, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
ํ์ด
1. ์นํจ์ง์ ์ขํ๋ค์ chicken ๋ฐฐ์ด์, ์ง์ ์ขํ๋ค์ house ๋ฐฐ์ด์ ๋ฃ๋๋ค
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cin >> input;
if(input==1)
house.push_back({i,j});
else if(input==2)
chicken.push_back({i,j});
}
}
2. chicken.size()๊ฐ์ ์นํจ์ง ์ค m๊ฐ์ ์นํจ์ง์ ๊ณ ๋ฅด๋ ์กฐํฉ์ ๊ณ ๋ฅด์
์กฐํฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ์ฌ๊ทํจ์๋ฅผ ์ด์ฉํ๋ค
// ์กฐํฉ์ผ๋ก m๊ฐ์ ์นํจ์ง ๊ตฌํ๊ธฐ
vector<int> combination(13);
vector<bool> used(13, false);
void recur(int index, int k) {
if(k==m) {
return;
}
for(int i=index; i<chicken.size(); i++) {
if(!used[i]) {
combination[k] = i;
used[i] = true;
recur(i, k+1);
used[i] = false;
}
}
}
3. ์กฐํฉ์ด ์์ฑ๋๋ฉด (๊ฐ ์ฌ๊ทํจ์์ ๋) ํด๋น ์กฐํฉ์ผ ๋์ ๋์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค
house๋ฆฌ์คํธ๋ฅผ ๋๋ฉฐ ๊ฐ ์ง์ ๋ํด ์กฐํฉ์ ์๋ ์นํจ ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ ์ต์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ
์ด ์ต์ ์นํจ ๊ฑฐ๋ฆฌ๋ค์ ํฉํ ๋์์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ ์ด ๋์์นํจ ๊ฑฐ๋ฆฌ๋ค ์ค ์ต์ ๋์์นํจ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋ต์ด๋ค
int cityDistance = 0;
// ํด๋น ์กฐํฉ์ ์นํจ์ง๋ง ์์ ๋์ ๋๋ก์ ์นํจ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
for(int i=0; i<house.size(); i++) {
int minDistance = 101; // ์ต๋ ์นํจ๊ฑฐ๋ฆฌ
for(int j=0; j<m; j++) {
int cur = combination[j];
int distance = getDistance(house[i], chicken[cur]);
if(distance < minDistance) {
minDistance = distance;
}
}
cityDistance += minDistance;
}
if(cityDistance < ans) {
ans = cityDistance;
}
์ฝ๋
#include <iostream>
#include <vector>
using namespace std;
typedef pair<int, int> ci;
int n,m;
vector<ci> house;
vector<ci> chicken;
// x์ขํ์ y์ขํ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
int getDistance(ci x, ci y) {
int x1=x.first, x2=x.second;
int y1=y.first, y2=y.second;
int dx = x1-y1>0 ? x1-y1 : y1-x1;
int dy = x2-y2>0 ? x2-y2 : y2-x2;
return dx+dy;
}
// ์กฐํฉ์ผ๋ก m๊ฐ์ ์นํจ์ง ๊ตฌํ๊ธฐ
int ans = 130001;
vector<int> combination(13);
vector<bool> used(13, false);
void recur(int index, int k) {
if(k==m) {
int cityDistance = 0;
// ํด๋น ์กฐํฉ์ ์นํจ์ง๋ง ์์ ๋์ ๋๋ก์ ์นํจ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
for(int i=0; i<house.size(); i++) {
int minDistance = 101; // ์ต๋ ์นํจ๊ฑฐ๋ฆฌ
for(int j=0; j<m; j++) {
int cur = combination[j];
int distance = getDistance(house[i], chicken[cur]);
if(distance < minDistance) {
minDistance = distance;
}
}
cityDistance += minDistance;
}
if(cityDistance < ans) {
ans = cityDistance;
}
return;
}
for(int i=index; i<chicken.size(); i++) {
if(!used[i]) {
combination[k] = i;
used[i] = true;
recur(i, k+1);
used[i] = false;
}
}
}
int main() {
cin >> n >> m;
int input;
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
cin >> input;
if(input==1)
house.push_back({i,j});
else if(input==2)
chicken.push_back({i,j});
}
}
recur(0, 0);
cout << ans;
}
'๐ Cpp' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 2217๋ฒ: ๋กํ (0) | 2024.03.15 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 1485๋ฒ: ๊ฐ๋ก์ (0) | 2024.03.13 |
[BOJ][C++] ๋ฐฑ์ค 1037๋ฒ: ์ฝ์ (0) | 2024.03.08 |
[BOJ][C++] ๋ฐฑ์ค 2849๋ฒ: ํ์ด์ ๋ฐํด (0) | 2024.03.06 |
[BOJ][C++] ๋ฐฑ์ค 14503๋ฒ: ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2023.11.23 |