λ¬Έμ
λ¬Έμ
μκ° μ ν 4μ΄, ν+μ μ 256MB μ΄λ΄ νΉμ μ€ν 256MB μ΄λ΄νΈμ κ°μ ν, μ΄, λλ λκ°μ μμ μλ λ§μ 곡격ν μ μλ€.
N*N 보λμ Nκ°μ νΈμ μλ‘ λ€λ₯Έ λ νΈμ΄ 곡격νμ§ λͺ»νκ² λλ κ²½μ°μ μλ λͺκ°μ§κ° μμκΉ?
Nμ΄ μ£Όμ΄μ‘μ λ, νΈμ λλ λ°©λ²μ μλ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
ν μ€νΈ μΌμ΄μ€μ μ T
보λμ κ°λ‘μ μΈλ‘ κ°, νΈμ κ°μ (1 β€ N β€ 10)
μΆλ ₯
νΈμ λλ λ°©λ²μ μ
νμ΄
λ¬Έμ λ₯Ό μ½μ νμ μκ°λ€μ μ λμ΄ν΄λ³΄λ©΄...
μΌλ¨ Nλ 10 μ΄λ΄κ³ μκ° μ νλ 4μ΄λΌ, μμ νμμΌλ‘ νμ΄λ³Ό λ§νλ€λ μκ°μ νλ€.
μ¬κ·λ₯Ό μ¬μ©νμ¬ νλ, μμμ λ΄λ €μ€λ©° νΈμ λλλ€.
νΈμ λμ μ μλμ§ νμΈν λ μ μΈλ‘, μ λκ°μ μ νμ
νκ³ ν΄λΉ μμΉ μ€μ νΈμ΄ μλ κ²½μ° λ μ¬κ·λ¬Έμ λλ¦¬μ§ μλλ€.
κ°λ¨νκ² 2λ‘ μμλ₯Ό λ€μ΄ μκ°ν΄λ³΄λ©΄...
0,0μ λ£λ κ²½μ° row++νκ³ 1,0κ³Ό 1,1μ λ£λ κ²½μ°λ₯Ό check ν¨μλ‘ νμΈνλ€.
0,1μ λ£λ κ²½μ° row++νκ³ 1,0κ³Ό 1,1μ λ£λ κ²½μ°λ₯Ό check ν¨μλ‘ νμΈνλ€.
λ λ€ λ λ΄λ €κ° rowκ° μμ -> 0 λ°ν, λͺ¨λ κ²½μ°μ μκ° 0μ λ°ν => κ°μ 0
4λ‘ μμλ₯Ό λ€λ©΄...
0,0μ λ£λ κ²½μ° row++ νκ³
1,0μ λ£λλ€ β μ λ¨(μ§νX)
1,1μ λ£λλ€ β μ λ¨(μ§νX)
1,2μ λ£λλ€ β κ°λ₯νλ―λ‘ μ§ν, 2,0 2,1 2,2 2,3μ λ£μ΄λ³΄λ©° λλμ§ μ§ν
1,3μ λ£λλ€ β κ°λ₯νλ―λ‘ μ§ν, 2,0 2,1 2,2 2,3μ λ£μ΄λ³΄λ©° λλμ§ μ§ν
μ΄ μκ°μ κΈ°λ°μΌλ‘ μμ±ν΄λ³Έ 첫 μ½λλ μ΄λ¬νλ€. (π§ μλͺ»λ μ½λ π§)
public class Solution {
static int N;
static int[][] drc = {
{-1, 0},
{-1, -1}, {-1, 1}
};
static int dfs(boolean[][] board, int row, int col) {
int result = 0;
if(!check(board, row, col)) { // λΆκ°λ₯ν κ²½μ° μΆκ° νμ X
return 0;
}
if(row == N-1) { // checkλ μ΄λ―Έ μλ¨μμ ν΅κ³Ό, row == Nμ΄λ©΄ λ, return 1;
return 1;
}
for(int i=row; i<N-1; i++) {
for(int j=col; j<N; j++) {
board[i][j] = true;
for(int k=0; k<N; k++) {
result += dfs(board, i+1, k);
}
board[i][j] = false;
}
}
return result;
}
static boolean check(boolean[][] board, int row, int col) {
for(int i=0; i<3; i++) { // drcλ₯Ό μννλ©΄μ λνκ³ λΉΌκ³ ν κ±°μ
int nR = row + drc[i][0];
int nC = col + drc[i][1];
// r, cμ drc 3κ°λ₯Ό κ°κ° λνλ©° 0μ΄λ Nμ λμ§ μμ λκΉμ§ νμΈ
while(nR >= 0 && nR < N
&& nC >= 0 && nC < N) {
if(board[nR][nC]) {
return false;
}
nR += drc[i][0];
nC += drc[i][1];
}
}
return true;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// N*N 보λμ Nκ°μ νΈμ 곡격νμ§ λͺ» νκ² λλ κ²½μ°
int T = Integer.parseInt(br.readLine());
for(int tc=1; tc<=T; tc++) {
// νμΈν λ : μλ§ λ³Έλ€ (μλλ κ³ λ € X)
// μμμλΆν° λ΄λ €μ€λ©΄μ λμ κ±°λκΉ
N = Integer.parseInt(br.readLine());
boolean[][] board = new boolean[N][N];
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
board[i][j] = false;
}
}
int result = 0;
// checkνκ³ trueλ°λ κ²½μ°μλ§ λ€μ colλ‘ λκΈ΄λ€
bw.write("#" + tc + " " + dfs(board, 0, 0) + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
1κ³Ό 2κΉμ§λ μ μλνμ§λ§ 4μ κ°μ΄ 40μ΄ λμλ€.
μ½μμ°½μ κ°μ μ°μ΄λ³΄λκΉ λ§€ μ΄μ μ΅μ 1κ°λ μμ΄μΌ Nκ°κ° λλλ°, μ΄λμ κ° falseλ‘ λ³ν λ°°μ΄λ λ€μ΄μμ κ°μ΄ checkλ₯Ό λκ³ κ°μ΄ μΆλ ₯λλ λͺ¨μμ΄μλ€.
μμ μ κ³μ νλ μμ€... rowλ₯Ό κ΅³μ΄ forλ¬ΈμΌλ‘ λ νμκ° μλ€λ κ±Έ κΉ¨λ¬μλ€.
λ΄ μκ°μλ 0~NκΉμ§ rowλ₯Ό λμμΌ νλ€κ³ μκ°ν΄μ μ λ κ² μμ±νμλλ°, κ° νμλ νΈμ νλλ§ λλ©΄ λλ―λ‘ rowκΉμ§ forλ¬Έμ λ릴 νμ μμ΄ colλ§ forλ¬Έμ λ리면 λλ€.
rowλ μ¬κ·ν¨μμ λ§€κ°λ³μλ‘ λ³΄λ΄μ 1μ© λ릴 κ²μ΄λ forλ¬Έμ μ κ±°νλ€.
colμ 0~NκΉμ§ μννλ©° λκΈ° μ , check ν¨μλ‘ λμ μ μλ μμΉμΈμ§ νμΈνλ€. νΈμ λμ μ μλ κ²½μ°, board[row][col] = true;λ‘ λ³κ²½ν΄ νΈμ λμλ€κ³ λ°°μ΄μ κ°μ λ³κ²½ν΄μ£Όκ³ , μ¬κ·λ¬Έμ λλ¦°λ€.
μ΄ν λ€μ col κ°μ λκΈ° μ false;λ‘ λ°°μ΄μ κ°μ λ³κ²½ν΄μ€λ€.
import java.io.*;
import java.util.*;
public class Solution {
static int N;
static int[][] drc = {
{-1, 0},
{-1, -1}, {-1, 1}
};
static int dfs(boolean[][] board, int row) {
int result = 0;
if(row == N) { // checkλ μ΄λ―Έ μλ¨μμ ν΅κ³Ό, row == Nμ΄λ©΄ λ, return 1;
return 1;
}
for(int col=0; col<N; col++) {
if(check(board, row, col)) {
board[row][col] = true;
result += dfs(board, row+1);
board[row][col] = false;
}
}
return result;
}
static boolean check(boolean[][] board, int row, int col) {
for(int i=0; i<3; i++) { // drcλ₯Ό μννλ©΄μ λνκ³ λΉΌκ³ ν κ±°μ
int nR = row + drc[i][0];
int nC = col + drc[i][1];
// r, cμ drc 3κ°λ₯Ό κ°κ° λ νλ©° 0μ΄λ Nμ λμ§ μμ λκΉμ§ νμΈ
while(nR >= 0 && nR < N
&& nC >= 0 && nC < N) {
if(board[nR][nC]) {
return false;
}
nR += drc[i][0];
nC += drc[i][1];
}
}
return true;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// N*N 보λμ Nκ°μ νΈμ 곡격νμ§ λͺ» νκ² λλ κ²½μ°
int T = Integer.parseInt(br.readLine());
for(int tc=1; tc<=T; tc++) {
N = Integer.parseInt(br.readLine());
boolean[][] board = new boolean[N][N];
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
board[i][j] = false;
}
}
bw.write("#" + tc + " " + dfs(board, 0) + "\n");
}
bw.flush();
bw.close();
br.close();
}
}
λ¬Έμ λ₯Ό νλ©°
ν λ² μκ°μ μλͺ»ν΄μ μ½μ§νκΈ° μμνλ©΄ μ λ§ μκ°μ λλ μμ΄ μ‘μλ¨Ήλ κ² κ°λ€. μ΄λ΄ λ κ·Έλ₯ λ€λ₯Έ λ¬Έμ νλ€κ° λμμμ μ½λ μ λΆ μ£Όμ μ²λ¦¬νκ³ μ²μλΆν° λ€μ μκ°ν΄λ΄μΌ νλ κ³ λ―Όμ΄ λλ€. μ§κΈμ΄μΌ μ°μ΅ μΌμ νΈλ κ±°λ μ κΉ κ±ΈμΌλ©° λ¨Έλ¦Ώμμ μ 리νλ μκ°μ κ°μ§ μ μμ§λ§, μ½λ© ν μ€νΈλ₯Ό λ³Ό λλ κ·Έλ΄ μ μμΌλκΉ... π₯Ί
ν ... μ²μλΆν° μ½λλ₯Ό κΌ¬μ΄μ§ μκ² μ§€ μ μκ²λ μ΅λν μ°μ΅μ λ§μ΄ ν΄λ³΄λ μ λ°μ μκ² λ€!