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 |