π μ΄λ €μ
μλ‘λ₯Ό μ‘μ μ μκ² λΉμμ λμ λ, λΉμ κ°μμ μ΅λκ°μ ꡬνλΌ.
무μνκ² λ€λ리λ νμ΄λ‘ μκ°λ³΅μ‘λλ μ΄λ€.
νμ§λ§ λ΄ νμ΄λ μλ§ μ΄κ²λ³΄λ€ λ λ§μ΄ λ€μμ κ²μ΄λ€. μλλ©΄ caught 체ν¬ν λ λ€μ λ€λ΄€κΈ° λλ¬Έμ μκ°λ³΅μ‘λλ μ΄μ λ .
#include <iostream>
using namespace std;
int board[11][11], n;
int dr[] = {0, 0, -1, 1}, dc[] = {1, -1, 0, 0};
int ret = 0;
bool isRange(int r, int c) {
return r>=0 && r<n && c>=0 && c<n;
}
bool isCaught(int r, int c, int dir) {
int rr[] = {1, -1, 1, -1}, cc[] = {1, 1, -1, -1};
int tr = r, tc = c;
while(isRange(tr, tc)) {
if(board[tr][tc]==2)
return true;
tr += rr[dir];
tc += cc[dir];
}
return false;
}
bool isCaught(int r, int c) {
for (int i=0; i<4; ++i) {
if(isCaught(r, c, i))
return true;
}
return false;
}
// κ·Έλ₯ λ€ λ보면 λμ§ μμκΉ
void solve(int r, int c, int cnt) {
for (int i=r; i<n; ++i) {
int cc = 0;
if(i==r+1)
cc = c+1;
for(int j=cc; j<n; ++j) {
if(board[i][j] == 0 || board[i][j] == 2)
continue;
if(isCaught(i, j))
continue;
board[i][j] = 2;
solve(i, j, cnt+1);
board[i][j] = 1;
}
}
ret = max(ret, cnt);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n;
for(int i=0; i<n; ++i) {
for(int j=0; j<n; ++j) {
cin>>board[i][j];
}
}
solve(0, 0, 0);
cout << ret;
//std::cout << "Hello, World!" << std::endl;
return 0;
}λ λΆλΆμΌλ‘ μͺΌκ°μ μκ°λ³΅μ‘λλ₯Ό μ€μ΄λ λ°©λ². μ΄μ κΉμ§ λ§μ΄ λ΄€λ λ°©λ²μΈλ° μκ°νμ§ λͺ»νμ΄ π’
체μ€νμμ νμλΆλΆκ³Ό κ²μλΆλΆμ λΉμμ΄ μ λ μλ‘λ₯Ό μ‘μ§ λͺ»νλ€λ κ²μ κΈ°λ°ν΄μ λ λΆλΆμΌλ‘ λλμ΄ ν μ μλ€. μ΄ κ²½μ°
κ²λ€κ° caught 체ν¬ν λ κ·Έ λκ°μ μ λͺ» μ¨λ€λ μ λ³΄λ§ κΈ°λ‘ν΄ λμΌλ©΄ μ 체ν¬νκΈ° λλ¬Έμ μ§μ§λ‘ μ΄λ€.
λκ°μ 체ν¬
/ ννμ λκ°μ μ κ°μ λκ°μ μ΄λΌλ©΄ r+c κ° κ°λ€. \ ννμ λκ°μ μ κ°μ λκ°μ μ΄λΌλ©΄ c-r μ΄ κ°λ€. c-r μ΄ μμμΌμλ μκΈ° λλ¬Έμ n-1 μ λν΄μ μμλ‘ λ§λ€μ΄μ£Όμ.
λ°©ν₯μΌλ‘ κ²μ¬νκΈ°
κ·Έλ₯ μμλλ‘ κ²μ¬λ₯Ό νλ€. λκ° λ¨μνλ° μκ°νκΈ° νλ€λ€.
#include <iostream>
using namespace std;
int board[11][11], n, total = 0;
int diag1[22], diag2[22];
int ret[2];
void solve(int r, int c, int cnt, bool flag) {
if (c >= n) {
r++;
c%2==0? c=1 : c=0;
}
if (r >= n) {
ret[flag] = max(ret[flag], cnt);
return;
}
if (board[r][c] && !diag1[c - r + n - 1] && !diag2[r + c]) {
diag1[c - r + n - 1] = diag2[r + c] = 1;
solve(r, c + 2, cnt + 1, flag);
diag1[c - r + n - 1] = diag2[r + c] = 0;
}
solve(r, c+2, cnt, flag);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> board[i][j];
}
}
solve(0, 0, 0, 0);
solve(0, 1, 0, 1);
cout << ret[0] + ret[1];
//std::cout << "Hello, World!" << std::endl;
return 0;
}