๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/BOJ

[BOJ] #7562 ๋‚˜์ดํŠธ์˜ ์ด๋™

by dar0m! 2019. 10. 13.
์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 256 MB 43.859%

 

 

7562๋ฒˆ: ๋‚˜์ดํŠธ์˜ ์ด๋™

๋ฌธ์ œ ์ฒด์ŠคํŒ ์œ„์— ํ•œ ๋‚˜์ดํŠธ๊ฐ€ ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ๋‚˜์ดํŠธ๊ฐ€ ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์€ ์•„๋ž˜ ๊ทธ๋ฆผ์— ๋‚˜์™€์žˆ๋‹ค. ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์ด ์ฃผ์–ด์ง„๋‹ค. ๋‚˜์ดํŠธ๋Š” ๋ช‡ ๋ฒˆ ์›€์ง์ด๋ฉด ์ด ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ž…๋ ฅ ์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์„ธ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ฒซ์งธ ์ค„์—๋Š” ์ฒด์ŠคํŒ์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด l(4 ≤ l ≤ 300)์ด ์ฃผ์–ด์ง„๋‹ค. ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ๋Š” l × l์ด๋‹ค. ์ฒด์ŠคํŒ์˜ ๊ฐ ์นธ์€ ๋‘ ์ˆ˜์˜ ์Œ {0, ...

www.acmicpc.net

 

๋ฌธ์ œ

์ฒด์ŠคํŒ ์œ„์˜ ๋‚˜์ดํŠธ๋ฅผ ๋ช‡ ๋ฒˆ ์›€์ง์—ฌ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋ชฉ์ ์ง€๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํšŸ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋‚˜์ดํŠธ์˜ ์ด๋™

๋‚˜์ดํŠธ์˜ ์ด๋™์„ ์ธ๋ฑ์Šค๋กœ ํ‘œํ˜„ํ•˜์—ฌ dx, dy ๋ผ๋Š” ๋ฐฐ์—ด์— ์ €์žฅํ•ด๋‘์—ˆ๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ํ•ด๋‹น ์ธ๋ฑ์Šค์—์„œ ๋ช‡ ๋ฒˆ์งธ ์ด๋™์ด์—ˆ๋Š”์ง€๋ฅผ chk[][]์— ์ €์žฅํ•˜๊ณ , ํ•ด๋‹น ์ธ๋ฑ์Šค๊ฐ€ ๋ชฉ์ ์ง€์™€ ๊ฐ™๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ๋๋‚ด๊ณ  ๋‹ต์„ ์ถœ๋ ฅํ–ˆ๋‹ค.

 

์‹œํ–‰์ฐฉ์˜ค

๊ณ„์† ๋งž๋Š”๋ฐ ์™œ ํ‹€๋ฆด๊นŒ ํ–ˆ๋”๋‹ˆ dx ๋ฅผ ๊ณ„์† int dx[] = { -2,-1,1,2,2,1,-1,-1 } ๋กœ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค. ์ œ๋Œ€๋กœ ๊ณ ์น˜๊ณ  ์„ฑ๊ณต. ๋„ˆ๋ฌด๋‚˜๋„ ํ—ˆ๋ฌดํ–ˆ๋‹ค. ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ์‹ค์ˆ˜ํ•˜์ง€ ์•Š๊ฒŒ ๊ผผ๊ผผํ•˜๊ฒŒ ํ™•์ธํ•˜์ž.

๋ฉ”๋ชจ๋ฆฌ ์‹œ๊ฐ„
2352  KB 20 ms
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
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
typedef pair<intint> p;
int dx[] = { -2,-1,1,2,2,1,-1,-2 }, dy[] = { 1,2,2,1,-1,-2,-2,-1 };
int t, n, chk[305][305], ans;
p start, destination;
void bfs(int x, int y) {
    if (x == destination.first && y == destination.second) {
        ans = 0
        return;
    }
    queue <p> q;
    q.push({ x, y });
    chk[x][y] = 0;
    
    while (!q.empty()) {
        int r = q.front().first, c = q.front().second;
        q.pop();
        for (int i = 0; i < 8; i++) {
            int nr = r + dx[i], nc = c + dy[i];
 
            if (nr < 0 || nr >= n || nc < 0 || nc >= n) continue;
            if (chk[nr][nc] > 0continue;
            chk[nr][nc] = chk[r][c] + 1;
            if (nr == destination.first && nc == destination.second) {
                ans = chk[nr][nc]; return;
            }
            q.push({ nr, nc });
        }
    }
}
int main() {
    scanf("%d"&t);
    while (t--) {
        scanf("%d"&n);
        scanf("%d %d %d %d"&start.first, &start.second, &destination.first, &destination.second);
        memset(chk, -1sizeof(chk));
        ans = 0;
 
        bfs(start.first, start.second);
 
        printf("%d\n", ans);        
    }
    return 0;
}
cs

 

์ฐธ๊ณ  ์‚ฌํ•ญ

for ๋ฌธ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ๋Š” ์กฐ๊ธˆ ์ค„์–ด๋“ค์ง€ ๋ชฐ๋ผ๋„ ์‹œ๊ฐ„์€ 4 ms ๋งŒํผ ์ฆ๊ฐ€ํ•œ๋‹ค!

1
2
3
4
5
6
7
8
9
10
11
for (int i = 0; i < 8; i++) {
    int nr = r + dx[i], nc = c + dy[i];
 
    if (nr >= 0 && nr < n && nc >= 0 && nc < n && chk[nr][nc] < 0) {
        chk[nr][nc] = chk[r][c] + 1;
        if (nr == destination.first && nc == destination.second) {
            ans = chk[nr][nc]; return;
        }
        q.push({ nr, nc });
    }
}
cs

๋Œ“๊ธ€