본문 바로가기
알고리즘/BFS

말과 기사 더블릿

by tryotto 2019. 2. 25.
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#include <stdio.h>
#include <queue>
#include <utility>
 
using namespace std;
 
queue<pair<intint> > q;
int knight[1005][1005= { 0 };
int ma[1005][1005= { 0 };
int arr[1005][1005= { 0 };
int kVisit[1005][1005= { 0 }; // visit 메모이제이션
int mVisit[1005][1005= { 0 };
 
int main() {
    int n, k;
    scanf("%d %d"&n, &k);
 
    for (int i = 1; i<=n; i++) {
        for (int j = 1; j <= n; j++) {
            int x;
            scanf("%d"&x);
 
            arr[i][j] = x;
            knight[i][j] = x;
            ma[i][j] = x;
        }
    }
 
    int x, y;
    scanf("%d %d"&x, &y);
    //문제가 입력을 좀 이상하게 받음
    q.push(make_pair(y, x));
    int tmpX = y, tmpY = x;
    
    while (q.empty() == false) {
        x = q.front().first;
        y = q.front().second;
        q.pop();
                
        //knight
        if (y - 2 > 0 && x - 1 > 0) {
            if (knight[y - 2][x - 1== 0 && kVisit[y-2][x-1==0) {
                knight[y - 2][x - 1= (knight[y][x] + 1);
                q.push(make_pair(x - 1, y - 2));
                kVisit[y - 2][x - 1= 1;
            }
        }
        if (y - 2 > 0 && x + 1 <= n) {
            if (knight[y - 2][x + 1== 0 && kVisit[y - 2][x + 1== 0) {
                knight[y - 2][x + 1= (knight[y][x] + 1);
                q.push(make_pair(x + 1, y - 2));
                kVisit[y - 2][x + 1= 1;
            }
        }
        if (y + 2 <= n && x - 1 > 0) {
            if (knight[y + 2][x - 1== 0 && kVisit[y + 2][x - 1== 0) {
                knight[y + 2][x - 1= (knight[y][x] + 1);
                q.push(make_pair(x - 1, y + 2));
                kVisit[y + 2][x - 1= 1;
            }
        }
        if (y + 2 <= n && x + 1 <= n) {
            if (knight[y + 2][x + 1== 0 && kVisit[y + 2][x + 1== 0) {
                knight[y + 2][x + 1= (knight[y][x] + 1);
                q.push(make_pair(x + 1, y + 2));
                kVisit[y + 2][x + 1= 1;
            }
        }
        if (y - 1 > 0 && x - 2 > 0) {
            if (knight[y - 1][x - 2== 0 && kVisit[y - 1][x - 2== 0) {
                knight[y - 1][x - 2= (knight[y][x] + 1);
                q.push(make_pair(x - 2, y - 1));
                kVisit[y - 1][x - 2= 1;
            }
        }
        if (y + 1 <= n && x - 2 > 0) {
            if (knight[y + 1][x - 2== 0 && kVisit[y + 1][x - 2== 0) {
                knight[y + 1][x - 2= (knight[y][x] + 1);
                q.push(make_pair(x - 2, y + 1));
                kVisit[y + 1][x - 2= 1;
            }
        }
        if (y - 1 > 0 && x + 2 <= n) {
            if (knight[y - 1][x + 2== 0 && kVisit[y - 1][x + 2== 0) {
                knight[y - 1][x + 2= (knight[y][x] + 1);
                q.push(make_pair(x + 2, y - 1));
                kVisit[y - 1][x + 2= 1;
            }
        }
        if (y + 1 <= n && x + 2 <=n) {
            if (knight[y + 1][x + 2== 0 && kVisit[y + 1][x + 2== 0) {
                knight[y + 1][x + 2= (knight[y][x] + 1);
                q.push(make_pair(x + 2, y + 1));
                kVisit[y + 1][x + 2= 1;
            }
        }
    }
    // 마
    q.push(make_pair(tmpX, tmpY));
    while (q.empty() == false) {
        x = q.front().first;
        y = q.front().second;
        q.pop();
                
        if (arr[y - 1][x] != 1) {
            if (y - 2 > 0 && x - 1 > 0) {
                if (ma[y - 2][x - 1== 0 && mVisit[y - 2][x - 1== 0) {
                    ma[y - 2][x - 1= (ma[y][x] + 1);
                    q.push(make_pair(x - 1, y - 2));
                    mVisit[y - 2][x - 1= 1;
                }
            }
            if (y - 2 > 0 && x + 1 <= n) {
                if (ma[y - 2][x + 1== 0 && mVisit[y - 2][x + 1== 0) {
                    ma[y - 2][x + 1= (ma[y][x] + 1);
                    q.push(make_pair(x + 1, y - 2));
                    mVisit[y - 2][x + 1= 1;
                }
            }
        }
        if (arr[y +1][x] != 1) {
            if (y + 2 <= n && x - 1 > 0) {
                if (ma[y + 2][x - 1== 0 && mVisit[y + 2][x - 1== 0) {
                    ma[y + 2][x - 1= (ma[y][x] + 1);
                    q.push(make_pair(x - 1, y + 2));
                    mVisit[y + 2][x - 1= 1;
                }
            }
            if (y + 2 <= n && x + 1 <= n) {
                if (ma[y + 2][x + 1== 0 && mVisit[y + 2][x + 1== 0) {
                    ma[y + 2][x + 1= (ma[y][x] + 1);
                    q.push(make_pair(x + 1, y + 2));
                    mVisit[y + 2][x + 1= 1;
                }
            }
        }
        if (arr[y][x-1!= 1) {
            if (y - 1 > 0 && x - 2 > 0) {
                if (ma[y - 1][x - 2== 0 && mVisit[y - 1][x - 2== 0) {
                    ma[y - 1][x - 2= (ma[y][x] + 1);
                    q.push(make_pair(x - 2, y - 1));
                    mVisit[y - 1][x - 2= 1;
                }
            }
            if (y + 1 <= n && x - 2 > 0) {
                if (ma[y + 1][x - 2== 0 && mVisit[y + 1][x - 2== 0) {
                    ma[y + 1][x - 2= (ma[y][x] + 1);
                    q.push(make_pair(x - 2, y + 1));
                    mVisit[y + 1][x - 2= 1;
                }
            }
        }
        if (arr[y][x+1!= 1) {
            if (y - 1 > 0 && x + 2 <= n) {
                if (ma[y - 1][x + 2== 0 && mVisit[y - 1][x + 2== 0 ) {
                    ma[y - 1][x + 2= (ma[y][x] + 1);
                    q.push(make_pair(x + 2, y - 1));
                    mVisit[y - 1][x + 2= 1;
                }
            }
            if (y + 1 <= n && x + 2 <= n) {
                if (ma[y + 1][x + 2== 0 && mVisit[y + 1][x + 2== 0) {
                    ma[y + 1][x + 2= (ma[y][x] + 1);
                    q.push(make_pair(x + 2, y + 1));
                    mVisit[y + 1][x + 2= 1;
                }
            }
        }
    }
    // 시작했던 지점 0으로 원상복구
    knight[tmpY][tmpX] = 0;
    ma[tmpY][tmpX] = 0;
 
    int rst = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (knight[i][j] <  ma[i][j] // 마 가 아예 가지 못한경우
                || (knight[i][j] != 0 && ma[i][j] == 0))
                rst++;
        }
    }
 
    printf("%d", rst);
}
cs


'알고리즘 > BFS' 카테고리의 다른 글

1697 숨바꼭질  (0) 2020.01.14
7562 나이트의 이동  (0) 2020.01.14
7576 토마토  (0) 2020.01.14
2178 미로 탐색  (0) 2020.01.13
댐 더블릿  (0) 2019.02.23