https://www.acmicpc.net/problem/14620
๋ฌธ์
2017๋ 4์ 5์ผ ์๋ชฉ์ผ์ ๋ง์ดํ ์ง์๋ ๋๋ฌด๋ฅผ ์ฌ๋ ๋์ ํ์ดํ ํฌ๊ด ์ ํ๋จ์ ๊ฝ์ ์ฌ์ด ๋ฑ๊ตํ ๋ ๋ง๋ค ๊ฝ๊ธธ์ ๊ฑท๊ณ ์ถ์๋ค.
์ง์๊ฐ ๊ฐ์ง ๊ฝ์ ์จ์์ ๊ฝ์ ์ฌ๊ณ ๋๋ฉด ์ ํํ 1๋ ํ์ ๊ฝ์ด ํผ๋ฏ๋ก ์ง์๋ ๋ค์ํด ์๋ชฉ์ผ ๋ถํฐ ๊ฝ๊ธธ์ ๊ฑธ์ ์ ์๋ค.
ํ์ง๋ง ์ง์์๊ฒ๋ ๊ฝ์ ์จ์์ด ์ธ๊ฐ๋ฐ์ ์์์ผ๋ฏ๋ก ์ธ ๊ฐ์ ๊ฝ์ด ํ๋๋ ์ฃฝ์ง ์๊ณ 1๋ ํ์ ๊ฝ์์ด ๋ง๊ฐํ๊ธธ ์ํ๋ค.
๊ฝ๋ฐญ์ N*N์ ๊ฒฉ์ ๋ชจ์์ด๊ณ ์ง์๋ ์จ์์ (1,1)~(N,N)์ ์ง์ ์ค ํ๊ณณ์ ์ฌ์ ์ ์๋ค. ๊ฝ์ ์จ์์ ๊ทธ๋ฆผ (a)์ฒ๋ผ ์ฌ์ด์ง๋ฉฐ 1๋ ํ ๊ฝ์ด ํผ๋ฉด ๊ทธ๋ฆผ (b)๋ชจ์์ด ๋๋ค.
๊ฝ์ ์ฌ์ ๋๋ ์ฃผ์ํ ์ ์ด์๋ค. ์ด๋ค ์จ์์ด ๊ฝ์ด ํ ๋ค ๋ค๋ฅธ ๊ฝ์(ํน์ ๊ฝ์ )๊ณผ ๋ฟ๊ฒ ๋ ๊ฒฝ์ฐ ๋ ๊ฝ ๋ชจ๋ ์ฃฝ์ด๋ฒ๋ฆฐ๋ค. ๋ ํ๋จ ๋ฐ์ผ๋ก ๊ฝ์์ด ๋๊ฐ๊ฒ ๋๋ค๋ฉด ๊ทธ ๊ฝ์ ์ฃฝ์ด๋ฒ๋ฆฌ๊ณ ๋ง๋ค.
๊ทธ๋ฆผ(c)๋ ์ธ ๊ฝ์ด ์ ์์ ์ผ๋ก ํ ๋ชจ์์ด๊ณ ๊ทธ๋ฆผ(d)๋ ๋ ๊ฝ์ด ์ฃฝ์ด๋ฒ๋ฆฐ ๋ชจ์์ด๋ค.
ํ์ดํ ํฌ ์ ํ๋จ์ ๋์ฌ ๊ฐ๊ฒฉ์ ๊ฒฉ์์ ํ ์ ๋ง๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ง์๋ ์๋ก ๋ค๋ฅธ ์ธ ์จ์์ ๋ชจ๋ ๊ฝ์ด ํผ๊ฒํ๋ฉด์ ๊ฐ์ฅ ์ผ ๊ฐ๊ฒฉ์ ํ๋จ์ ๋์ฌํ๊ณ ์ถ๋ค.
๋จ ํ๋จ์ ๋์ฌํ ๋๋ ๊ฝ์์ด ํ ๋ชจ์์ ๊ธฐ์ค์ผ๋ก ๋์ฌ๋ฅผ ํด์ผํ๋ฏ๋ก ๊ฝ ํ๋๋น 5ํ์ ๋ ์ ๋์ฌํด์ผ๋ง ํ๋ค.
๋์ด ๋ง์ง ์์ ์ง์๋ฅผ ์ํ์ฌ ์ง์๊ฐ ๊ฝ์ ์ฌ๊ธฐ ์ํด ํ์ํ ์ต์๋น์ฉ์ ๊ตฌํด์ฃผ์!
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์ ํ๋จ์ ํ ๋ณ์ ๊ธธ์ด N(6≤N≤10)์ด ๋ค์ด์จ๋ค.
์ดํ N๊ฐ์ ์ค์ N๊ฐ์ฉ ํ๋จ์ ์ง์ ๋น ๊ฐ๊ฒฉ(0≤G≤200)์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๊ฝ์ ์ฌ๊ธฐ ์ํ ์ต์ ๋น์ฉ์ ์ถ๋ ฅํ๋ค.
ํ์ด
// Authored by : seondal
// Co-authored by : -
// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int,int> p;
vector<vector<int>> input;
vector<vector<p>> successPos;
int dx[] = {0,0,-1,1};
int dy[] = {1,-1,0,0};
// ์ฃผ์ด์ง ๋ฒกํฐ์ ์๋ ์จ์๋ค์ด ๊ฝ์ ํผ์ ์ ๋ ๋
๊ฐ๊ฒฉ์ ๊ตฌํ๋ ํจ์
int calcSum(vector<p> v) {
int sum = 0;
for(int i=0; i<3; i++) {
p cur = v[i];
sum += input[cur.first][cur.second]; // ์จ์ ์์น ๋
๊ฐ ๋ํ๊ณ
// ์์น๊ฐ ์ฃผ์ด์ง ์จ์์ ๊ฝ ํผ์ฐ๊ธฐ
for(int dir=0; dir<4; dir++) {
int x = cur.first + dx[dir];
int y = cur.second + dy[dir];
sum += input[x][y]; // ๊ฝ์ ์์น ๋
๊ฐ ๋ํ๊ณ
}
}
return sum;
}
// ์ธ ์ขํ์ ์จ์์ ์ฌ์์ ๋ ๊ฝ ๊ฐํ๊ฐ ์ฑ๊ณตํ๋์ง ๋ฆฌํด
bool isSucceed(int n, vector<p> &seedpos) {
vector<vector<bool>> flowerPos (n, vector<bool>(n,false));
// ๊ฝ ์์น ๋ฒกํฐ์ ์จ์ ์์น ํ์
for(int i=0; i<3; i++)
flowerPos[seedpos[i].first][seedpos[i].second] = true;
// ๊ฝ ํผ์ฐ๊ธฐ
for(int i=0; i<3; i++) {
p cur = seedpos[i];
// (์จ์์ ์ํ์ข์ฐ์ ์์น ํ์)
for(int dir=0; dir<4; dir++) {
int x = cur.first + dx[dir];
int y = cur.second + dy[dir];
// ๊ฝ์ด ๋
์ ๋ฒ์ด๋๊ฑฐ๋ ์ด๋ฏธ ๊ฝ์ด ์์ด์ ๊ฒน์น๋ค๋ฉด
if(x<0 || x>=n || y<0 || y>=n || flowerPos[x][y])
return false;
flowerPos[x][y] = true;
}
}
return true;
}
int solution (int n) {
// permutation์ผ๋ก ์กฐํฉ์ ๊ตฌํ๊ธฐ ์ํ ์์ ๋ฐฐ์ด
int tot = n*n;
vector<bool> tmp(tot, false);
tmp[tot-1] = tmp[tot-2] = tmp[tot-3] = true;
do{
vector<p> seedPos;
// ์กฐํฉ์ผ๋ก ์จ์ ์์น๊ฐ ๋ ์ ์๋ ์ขํ๋ค ๊ตฌํด์ seedPos ๋ฒกํฐ์ ๋ฃ๊ธฐ
for(int i=0; i<tot; i++) {
if(tmp[i])
seedPos.push_back({i/n, i%n});
}
// ์จ์ ์ฌ๊ธฐ์ ์ฑ๊ณตํ๋ฉด successPos์ ๋ฃ๊ธฐ
if(isSucceed(n, seedPos))
successPos.push_back(seedPos);
} while (next_permutation(tmp.begin(), tmp.end()));
// ๊ฐ ์กฐํฉ์ ๋
๊ฐ๋ค์ ์ต์๊ฐ ๊ตฌํ๊ธฐ
int minCost = 3001;
for(int i=0; i<successPos.size(); i++) {
int curCost = calcSum(successPos[i]);
minCost = min(minCost, curCost);
}
return minCost;
}
int main() {
int n;
cin >> n;
input.assign(n, vector<int>(n,0));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin >> input[i][j];
cout << solution(n);
}
/*
*/
'๐๏ธ ICPC Sinchon > Bruteforce' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 6064๋ฒ: ์นด์ ๋ฌ๋ ฅ (0) | 2024.08.12 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 2309๋ฒ: ์ผ๊ณฑ ๋์์ด (0) | 2023.01.19 |
[BOJ S4][C++] ๋ฐฑ์ค 1544๋ฒ: ์ฌ์ดํด ๋จ์ด (0) | 2022.09.21 |
[BOJ][C++] ๋ฐฑ์ค 14889๋ฒ: ์คํํธ์ ๋งํฌ (0) | 2022.09.17 |
[BOJ][C++] ๋ฐฑ์ค 1436๋ฒ : ์ํ๊ฐ๋ ์ (0) | 2022.09.17 |