[C언어] 7562. 나이트의 이동

SW 업무 관련/백준

[C언어] 7562. 나이트의 이동

WillBe_ 2018. 8. 14. 00:09


이동 가능한 방향 다 Q에 넣어주고 BFS 돌리면 끝!


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
#include <stdio.h>
#include <string.h>
 
typedef struct {
    int x;
    int y;
}Point;
 
int move[8][2= { { -2,1 },{ -2,-1 },{ 2,1 },{ 2,-1 },{ 1,-2 },{ -1,-2 },{ 1,2 },{ -1,2 } };
int map[333][333];
int Len, S_X, S_Y, G_X, G_Y;
int visit[333][333];
int D[333 * 333];
Point Q[333 * 333];
 
int BFS(int y, int x)
{
    memset(visit, 0sizeof(visit));
    memset(Q, 0sizeof(Q));
    memset(D, 0sizeof(D));
 
    int Q_Front = -1, Q_Back = -1;
    Q[++Q_Back].y = y;
    Q[Q_Back].x = x;
    visit[y][x] = 1;
 
    while (Q_Back != Q_Front)
    {
        int yy = Q[++Q_Front].y;
        int xx = Q[Q_Front].x;
 
        for (int i = 0; i < 8; i++)
        {
 
            int yyy = yy + move[i][0];
            int xxx = xx + move[i][1];
 
            if (yyy < 0 || xxx < 0 || xxx >= Len || yyy >= Len)
                continue;
 
            if (xxx == G_X && yyy == G_Y && visit[yyy][xxx] == 0)
            {
                return D[Q_Front] + 1;
            }
            else if (visit[yyy][xxx] == 0)
            {
                Q[++Q_Back].y = yyy;
                Q[Q_Back].x = xxx;
                visit[yyy][xxx] = 1;
                D[Q_Back] = D[Q_Front] + 1;
            }
        }
    }
 
    return 0;
}
 
 
int main()
{
    int Test;
    scanf("%d"&Test);
    for (int i = 0; i < Test; i++)
    {
        memset(map, 0sizeof(map));
        scanf("%d"&Len);
        scanf("%d %d"&S_Y, &S_X);
        scanf("%d %d"&G_Y, &G_X);
 
        printf("%d\n", BFS(S_Y, S_X));
 
    }
    return 0;
}
cs


'SW 업무 관련 > 백준' 카테고리의 다른 글

[C언어]2573. 빙산  (0) 2018.09.16
[C언어] 2015 오목.  (0) 2018.08.21
[C언어] 2206. 벽 부수고 이동하기  (0) 2018.08.12
[C언어] 2667. 단지 번호붙이기  (0) 2018.08.12
[C언어] 1012. 유기농배추  (0) 2018.08.12