이동 가능한 방향 다 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, 0, sizeof(visit)); memset(Q, 0, sizeof(Q)); memset(D, 0, sizeof(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, 0, sizeof(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 |