티스토리 뷰

 

문제를 읽어보면 그냥 BFS+시뮬레이션으로 풀면 될거같다

심지어 크기도 작다!!

 

악마->수연  이 순서대로 보내면 수연이가 갈 수 있는곳의 최단거리를 BFS로 구할 수 있다!

 

큐를 2개만들고 악마큐를 먼저 실행시키고, 수연이큐를 실행시키자

악마가 다음칸으로 갈 수 있는 조건은 .이거나 S이거나이고

수연이가 갈수있는 조건은 .이거나 D이다!

 

악마가 방문할때마다 *로 바꿔주고 수연이가 방문할때마다 S로 바꿔주면 

답이 착하게 나온다!!

 

 

소스코드

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
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m; 
char arr[55][55];
int dist[55][55];
bool check[55][55];
int dx[4= {0,0,-1,1};
int dy[4= {1,-1,0,0};
bool inner(int x,int y){
    return (0<=&& x<&& 0<=&& y<m);
}
int Sx,Sy,Dx,Dy;
int main(){
    int t; scanf(" %d",&t);
    for(int tc=1;tc<=t;tc++){
        scanf(" %d %d",&n,&m);
        memset(check,0,sizeof(check));
        memset(dist,0,sizeof(dist));
        queue<pair<int,int>> su,de;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                scanf(" %1c",&arr[i][j]);
                if(arr[i][j]=='S') Sx=i,Sy=j;
                else if(arr[i][j]=='D') Dx=i,Dy=j;
                else if(arr[i][j]=='*') {
                    de.push({i,j});
                    check[i][j]=true;
                }
            }
        }
        su.push({Sx,Sy});
        check[Sx][Sy]=true;
        while(!su.empty()){
            int s = de.size();
            while(s>0 && s--){
                int x = de.front().first;
                int y = de.front().second;
                de.pop();
                for(int i=0;i<4;i++){
                    int nx = x+dx[i];
                    int ny = y+dy[i];
                    if(inner(nx,ny) && ((!check[nx][ny] && arr[nx][ny]=='.'|| (check[nx][ny] && arr[nx][ny]=='S'))){
                        check[nx][ny]=true;
                        arr[nx][ny]='*';
                        de.push({nx,ny});
                    }
                }
            }
            s=su.size();
            while(s>0 && s--){
                int x = su.front().first;
                int y = su.front().second;
                su.pop();
                arr[x][y]='.';
                for(int i=0;i<4;i++){
                    int nx = x+dx[i];
                    int ny = y+dy[i];
                    if(inner(nx,ny) && !check[nx][ny] && (arr[nx][ny]=='.' || arr[nx][ny]=='D')){
                        check[nx][ny]=true;
                        arr[nx][ny]='S';
                        dist[nx][ny]=dist[x][y]+1;
                        su.push({nx,ny});
                    }
                }
            }
        }
        printf("#%d ",tc);
        if(dist[Dx][Dy]==0) puts("GAME OVER");
        else printf("%d\n",dist[Dx][Dy]);
    }
}
 
 

'알고리즘 > SW Expert Academy' 카테고리의 다른 글

[SWEA] 5215 햄버거 다이어트  (0) 2020.04.23
[SWEA] 7396 종구의 딸 이름 짓기  (0) 2020.03.06
[SWEA] 5684 운동  (0) 2020.03.05
[SWEA] 7988 내전 경기  (0) 2020.03.04
[SWEA] 8275 햄스터  (0) 2020.03.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
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
글 보관함