우선, 치킨집을 조합방식을 통해 M개를 선정후, 그 치킨집의 x좌표와, y좌표를 저장합니다.
이후에 각 집을 돌아가면서, 치킨거리의 최솟값을 합해서 도시의 치킨거리를 구하면 됩니다.
여기서 킥 포인트는, DFS 백트래킹을 시도할 때, 2차원 배열로 치킨집을 돌아야하는 것을 1개 for문을 통하여 순회 할 수 있었다는 점입니다.
치킨거리를 구할 때, for문을 많이 써서 가독성이 좀 떨어지는듯해요 ㅠㅠ.. 다음에는 2차원 배열을 1차원으로 구현해야겠어요
🔔 Code :
#include <iostream>
#include <cmath>
using namespace std;
int n, m; // (n, n) 치킨집 m개
int city[51][51];
int xChickenShop[13];
int yChickenShop[13];
int MIN = 10000;
int chickenStreet() {
int r = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int t = 10000;
if (city[i][j] == 1) {
for (int k = 0; k < m; k++) {
int tmp = abs(xChickenShop[k] - i) + abs(yChickenShop[k] - j);
t = tmp < t ? tmp : t;
}
r += t;
}
}
}
return r;
}
void DFS(int cnt =0, int k =0) {
if (cnt == m) {
int tmp = chickenStreet();
MIN = MIN > tmp ? tmp : MIN;
return;
}
for (int i = k; i < n*n; i++) {
int x = i % n;
int y = i / n;
x++, y++;
if (city[x][y] == 2) {
xChickenShop[cnt] = x;
yChickenShop[cnt] = y;
DFS(cnt + 1, i + 1);
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> city[i][j];
}
}
DFS();
cout << MIN;
}