1799 비숍


개인적으로 정말 어려웠다.

처음 N-Queens Problem풀듯이 풀려고 했으나 시간초과가 났고 대각탐색등 다양하게 해봤는데 다 실패했다. 다음방법으로 검정칸에 있는 비숍은 검정칸만 이동가능하고 하얀칸에 있는 비숍은 하얀칸만 이동 가능하므로 맵을 반으로 나눠 각각 백트래킹 하였다.


dfs은 하얀칸만 탐색/ dfs2는 검정칸만 탐색 하도록 하였다.


 

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include <iostream>
#include <algorithm>
using namespace std;
 
int n, res, cnt;
int map[10][10];
bool visited[10][10];
 
//타탕성 검증
bool isOK(int r,int c) {
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < n; j++) {
            if (visited[i][j]) {
                if (abs(r - i) == abs(c - j))return false;
            }
        }
    }
    return true;
}
 
void printAll() {
    cout << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (visited[i][j]) cout << "o ";
            else cout << "x ";
        }
        cout << endl;
    }
}
 
void dfs(int x,int y) {
    if (!isOK(x, y)) return;
 
    visited[x][y] = true;
    cnt++;
    if (res < cnt) {
        res = cnt;
    }
    for (int i = y + 1; i < n; i++) {
        if (x % 2 == 0) {
            if (i % 2 == 0) {
                if (map[x][i] == 1)
                    dfs(x, i);
            }
        }
        if (x % 2 == 1) {
            if (i % 2 == 1) {
                if (map[x][i] == 1)
                    dfs(x, i);
            }
        }
    }
    for (int i = x + 1; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i % 2 == 0) {
                if (j % 2 == 0) {
                    if (map[i][j] == 1)
                        dfs(i, j);
                }
            }
            if (i % 2 == 1) {
                if (j % 2 == 1) {
                    if (map[i][j] == 1)
                        dfs(i, j);
                }
            }
        }
    }
 
    cnt--;
    visited[x][y] = false;
}
 
void dfs2(int x, int y) {
    if (!isOK(x, y)) return;
 
    visited[x][y] = true;
    cnt++;
    if (res < cnt) {
        res = cnt;
    }
    for (int i = y + 1; i < n; i++) {
        if (x % 2 == 0) {
            if (i % 2 == 1) {
                if (map[x][i] == 1)
                    dfs2(x, i);
            }
        }
        if (x % 2 == 1) {
            if (i % 2 == 0) {
                if(map[x][i] == 1)
                    dfs2(x, i);
            }
        }
    }
    for (int i = x + 1; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i % 2 == 0) {
                if (j % 2 == 1) {
                    if (map[i][j] == 1)
                        dfs2(i, j);
                }
            }
            if (i % 2 == 1) {
                if (j % 2 == 0) {
                    if (map[i][j] == 1)
                        dfs2(i, j);
                }
            }
        }
    }
 
    cnt--;
    visited[x][y] = false;
}
 
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> map[i][j];
        }
    }
    int ans = 0;
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i % 2 == 0) {
                if (j % 2 == 0) {
                    if (map[i][j] == 1)
                        dfs(i, j);
                }
            }
            if (i % 2 == 1) {
                if (j % 2 == 1) {
                    if (map[i][j] == 1)
                        dfs(i, j);
                }
            }
        }
    }
    ans += res;
    res = 0;
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i % 2 == 0) {
                if (j % 2 == 1) {
                    if (map[i][j] == 1)
                        dfs2(i, j);
                }
            }
            if (i % 2 == 1) {
                if (j % 2 == 0) {
                    if (map[i][j] == 1)
                        dfs2(i, j);
                }
            }
        }
    }
    ans += res;
 
    cout << ans << endl;
}
cs


'BOJ::문제풀이' 카테고리의 다른 글

1963 소수경로  (0) 2018.04.02
12100 2048 (Easy)  (0) 2018.04.01
13549 숨바꼭질 3  (0) 2018.03.26
12851 숨바꼭질 2  (0) 2018.03.26
1600 말이 되고픈 원숭이  (0) 2018.03.26

+ Recent posts