개인적으로 정말 어려웠다.
처음 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 |