반응형

www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

백트래킹: DFS + 가지치기

 

1. 현재 위치에 퀸 놓을 수 있는지 없는지 검사

2. 현재 위치에 말을 놓을 수 있다면, 현재 위치가 마지막 줄인지 검사

  1) 마지막 줄이면 return 1

  2) 아니면 현재 좌표 저장 후 다음 라인 탐색

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <cstring>
using namespace std;
 
int n;
int x_pos[16];
int y_pos[16];
int dfs(int x, int y) {
    // 1. 조건 검사 (현재까지 진행된 라인까지만 검사)
    for (int i = 0; i < x; i++) {
        // i번째 줄의 x 좌표와 현재 x 좌표가 같다면
        if (x_pos[i] == x)
            return 0;
        // i번째 줄의 y 좌표와 현재 y 좌표가 같다면
        if (y_pos[i] == y)
            return 0;
        // i번째 줄의 대각선 위치가 같다면
        // 대각선일 경우 x, y좌표 위치가 동일하게 증가(감소)함
        // (x 좌표 변화량 == y 좌표 변화량) -> 같은 대각선 상에 있음
        if (abs(x - x_pos[i]) == abs(y - y_pos[i]))
            return 0;
    }
 
    // 2. 제일 아랫줄 도착
    if (x == n-1)
        return 1;
    
    // 3. 현재 말의 위치 저장
    // x번째 줄에서의 좌표(x,y) 저장
    x_pos[x] = x, y_pos[x] = y;
 
    int cnt = 0;
    // 4. 다음 라인 탐색
    for (int i = 0; i < n; i++) {
        cnt += dfs(x + 1, i);
    }
    return cnt;
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    int ans = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        ans += dfs(0, i);
    }
    cout << ans;
}
cs

참고: www.youtube.com/watch?v=ltm-JX5R1pA

반응형

'백준 > 백트래킹' 카테고리의 다른 글

백준 10819  (0) 2021.02.03
백준 1987  (0) 2021.02.03
백준 1759  (0) 2021.02.03
백준 1182  (0) 2021.01.30
백준 6603  (0) 2021.01.30
반응형

www.acmicpc.net/problem/1436

1. 숫자 -> 문자 변환

2. 문자에서 "666" 포함되는지 검사

  - 포함 (O): cnt 증가. if(cnt == input) 이면 출력 후 종료

 

#include <string>

to_string(): 정수 -> 문자열 변환

.find(): 문자열의 위치 반환. 못 찾을 경우 -1 반환

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
using namespace std;
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int input;
    cin >> input;
    int num = 666;
    int cnt = 0;
    string str = "";
    while (true) {
        // 정수 -> 문자열
        str = to_string(num);
        // 문자열에 666 포함?
        if (str.find("666"!= -1) {
            cnt++;
            if (cnt == input)
                break;
        }
        num++;
    }
    cout << num;
}
cs
반응형

'백준 > 브루트포스' 카테고리의 다른 글

백준 6064  (0) 2021.02.13
백준 1107 [복습 필수]  (0) 2021.02.13
백준 1476  (0) 2021.02.13
백준 3085  (0) 2021.02.13
백준 1018  (0) 2021.01.25
반응형

www.acmicpc.net/problem/1018

1. 필터 생성

1) char b_first[8][8]

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

 

2) char w_first[8][8]

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

WBWBWBWB

BWBWBWBW

 

2. 시작 좌표 바꿔가면서 필터[][]와 input[][] 값이 다르면 count++

3. 최솟값 찾기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#define rep(i, n) for(int i = 0; i<n; i++)
using namespace std;
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    char b_first[8][8];
    char w_first[8][8];
 
    // 필터 초기화
    rep(i, 8) {
        rep(j, 8) {
            if ((i + j) % 2 == 0) {
                b_first[i][j] = 'B';
                w_first[i][j] = 'W';
            }
            else {
                b_first[i][j] = 'W';
                w_first[i][j] = 'B';
            }
        }
    }
 
    char input[50][50];
    int n, m;
    cin >> n >> m;
    rep(i, n) {
        rep(j, m)
            cin >> input[i][j];
    }
    
    int min = 987654321;
    // 시작 위치 바꿔가면서 필터와 input 비교
    for (int i = 0; i <= n - 8; i++) {
        for (int j = 0; j <= m - 8; j++) {
            int b_cnt = 0;
            int w_cnt = 0;
 
            for(int k = i; k<i+8; k++){
                for (int l = j; l < j + 8; l++) {
                    if (b_first[k - i][l - j] != input[k][l])
                        b_cnt++;
                    if (w_first[k - i][l - j] != input[k][l])
                        w_cnt++;
                }
            }
            // 최솟값 찾기
            int temp = b_cnt < w_cnt ? b_cnt : w_cnt;
            min = min < temp ? min : temp;
        }
    }
    cout << min;
}
cs

 

반응형

'백준 > 브루트포스' 카테고리의 다른 글

백준 6064  (0) 2021.02.13
백준 1107 [복습 필수]  (0) 2021.02.13
백준 1476  (0) 2021.02.13
백준 3085  (0) 2021.02.13
백준 1436  (0) 2021.01.25

+ Recent posts