๋ฌธ์
์ฝ๋
#include <iostream>
#include <vector>
#include <memory.h>
#include <algorithm>
#define INF 1e9
using namespace std;
int N, M;
int map[51][51];
vector<pair<int,int>> store; // ์นํจ์ง ์ขํ
bool is_store[51][51]; // ํ์
ํ์ง ์์ ์นํจ์ง์ธ์ง ์ ๋ฌด
int house_store_dist[51][51]; // ํด๋น ์ง์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ
int ans = INF;
void dist(){ // ์ง๊ณผ ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ ๊ฐฑ์
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
if(map[i][k] == 1){ // ์ง์ผ๋
for(auto it : store){
if(is_store[it.first][it.second] == 1){ // ํ์
ํ์ง ์์ ์นํจ ์ง์ผ ๋
int dist = abs(it.first - i) + abs(it.second - k);
house_store_dist[i][k] = min(house_store_dist[i][k], dist); // ์ต์ ๊ฑฐ๋ฆฌ ๊ฐฑ์
}
}
}
}
}
}
void check_min_dist(){
int ans_temp = 0;
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
if(map[i][k] == 1) ans_temp += house_store_dist[i][k];
}
}
ans = min(ans_temp, ans);
}
void backtraking(int idx, int is_store_cnt){
if(is_store_cnt>M) return; // ์ดค๋ ํ์
๊ฐ๋ฅ ์ ๋ณด๋ค ๋ ๋ง์ด ํ์
ํ์ ๋ return
if(is_store_cnt>0){
dist();
check_min_dist();
}
for(int i = idx; i<store.size(); i++){
int r = store[i].first;
int c = store[i].second;
is_store[r][c] = 1; // ํ์
ํ์ง ์์ ์นํจ์ง
int backup[51][51] = {};
memcpy(backup, house_store_dist, sizeof(house_store_dist));
backtraking(i+1, is_store_cnt+1);
memcpy(house_store_dist, backup, sizeof(backup));
is_store[r][c] = 0; // ํ์
ํ ์นํจ์ง
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>N>>M;
for(int i=0; i<N; i++){
for(int k=0; k<N; k++){
cin>>map[i][k];
if(map[i][k] == 2) store.push_back({i, k});
}
}
for(int i=0; i<51; i++) fill(house_store_dist[i], house_store_dist[i]+51, INF);
backtraking(0, 0);
cout<<ans;
}
ํ์ด
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
์์ ๊ฐ์ ๋์๊ฐ ์์ ๋ 1์ ๊ฐ์ ์ง, 2๋ ์นํจ์ง์ ์๋ฏธํฉ๋๋ค.
์ ๋์์์ ํ์ ์ํค์ง ์์ ์นํจ์ง์ ์ต๋ M๊ฐ๋ฅผ ๊ณจ๋์ ๋, ๊ทธ ํ์ ์ํค์ง ์์ ์นํจ์ง๊ณผ ๊ฐ ๊ฐ์ ์ง๊ณผ์ ๊ฑฐ๋ฆฌ์ ๊ฐ๊ฐ์ ์ต์๊ฐ์ ์ ๋ถ ๋ํ ๊ฐ์ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ ๋๋ค.
๋จผ์ ์นํจ์ง์ ์์น๋ฅผ ์ ๋ถ ๋ฐฐ์ด์ ์ ์ฅํ๊ณ , ๊ฐ ์นํจ์ง์ M๊ฐ ์ดํ๋งํผ ๋ฐฑํธ๋ํน ์กฐํฉ์ ํตํด ๊ณ ๋ฅธ ํ, ๊ทธ๋๋ง๋ค ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์๋ฎฌ๋ ์ด์ ๋๋์ด ๋๋ ๋ฌธ์ ์ด๊ธฐ๋ ํ๋ฐ, ์กฐํฉ์ ๊ตฌํด์ผ ํ๋ค๋ ์ ์์ ๋ฐฑํธ๋ํน์ผ๋ก ๋ถ๋ฅ๊ฐ ๋์ด์์ง ์๋ ์ถ์ต๋๋ค.
'Algorithm ๐ง๐ปโ๐ป > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค,c++] 1761๋ฒ - ์ ์ ๋ค์ ๊ฑฐ๋ฆฌ (0) | 2022.09.01 |
---|---|
[๋ฐฑ์ค,c++] 11438๋ฒ - LCA 2 (0) | 2022.08.30 |
[๋ฐฑ์ค,c++] 16236๋ฒ - ์๊ธฐ ์์ด (0) | 2022.08.28 |
[๋ฐฑ์ค,c++] 16234๋ฒ - ์ธ๊ตฌ ์ด๋ (0) | 2022.08.25 |
[๋ฐฑ์ค,c++] 17135๋ฒ - ์บ์ฌ๋ํ์ค (2) | 2022.08.25 |
[๋ฐฑ์ค,c++] 14503๋ฒ - ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2022.08.24 |
๋๊ธ