본문 바로가기
Algorithm/백트래킹

[백준][1799번][백트레킹] 비숍

by 우툴 2016. 3. 30.
728x90

비숍

https://www.acmicpc.net/problem/1799

<문제>

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
 
int map[11][11];    // 처음 받아오는 값
int visit_a[30];    // 체크
int visit_b[30];
int Max = 0;
int chessSize;
 
 
void Black(int row, int cal, int cnt){
    if (cnt > Max)
        Max = cnt;
 
    
    if (cal > chessSize){
        row++;
 
        if (row % 2 == 0)
            cal = 2;
        else
            cal = 1;
    }
 
    if (row > chessSize){
        return;
    }
 
    if (visit_a[row + cal] == 0 && visit_b[10 + row - cal] == 0 && map[row][cal] == 1){
        visit_a[row + cal] =1;
        visit_b[10 + row - cal] = 1;
        Black(row, cal + 2, cnt+1);
        visit_a[row + cal] = 0;
        visit_b[10 + row - cal] = 0;
    }
    Black(row, cal + 2, cnt);
}
 
void White(int row, int cal, int cnt){
    if (cnt > Max)
        Max = cnt;
 
 
    if (cal > chessSize){
        row++;
 
        if (row % 2 == 0)
            cal = 1;
        else
            cal = 2;
    }
 
    if (row > chessSize){
        return;
    }
 
    if (visit_a[row + cal] == 0 && visit_b[10 + row - cal] == 0 && map[row][cal] == 1){
        visit_a[row + cal] = 1;
        visit_b[10 + row - cal] = 1;
        White(row, cal + 2, cnt + 1);
        visit_a[row + cal] = 0;
        visit_b[10 + row - cal] = 0;
    }
    White(row, cal + 2, cnt);
}
 
int main(void){
    int result;
    scanf("%d", &chessSize);
 
    for (int i = 1; i <= chessSize; i++)
        for (int j = 1; j <= chessSize; j++)
            scanf("%d", &map[i][j]);
 
    Black(110);    // 1,1 시작 에서 0번
    result = Max;
    Max = 0;
 
    White(120);
    result += Max;
 
    printf("%d\n", result);
 
    return 0;
}
cs

<문제 푼 요령>

 1. 체스 판에서 비숍은 검정색 타일에 있는 녀석과 흰색 타일에 있는 녀석은 만날일이 없으므로 따로 검색해서 찾는다.

 2. 비숍을 놓는 경우와 놓지 않는 경우로 나누어서 재귀를 한다. 

 3. visit 배열 같은 경우는 두개로 나누어서 생각 할 수 있다. 비숍은 그 곳에 놓으면 대각선 타일에는 놓을 수 없다. 이 대각 선을 간단하게 표현해 줄 수 있는게 row+cal 이랑 mapsize(체스판 사이즈) + r ow- cal 로 나누어서 구별을 한다면 쉽게 대각선을 처리할 수 있다

 4. 그래서 각 타일당 가장 비숍을 많이 놓을 수 있는 경우를 출력해서 더하면 된다.

728x90

댓글