티스토리 뷰

Algorithm/SW Expert Academy

1953 탈주범 검거

henry1214 2018. 3. 16. 18:07

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpLlKAQ4DFAUq



BFS를 깊이가 L이 될 때까지 돌려준다. 현재 파이프와 다음 파이프를 비교하여 서로 매칭될 수 있는지 확인하면서 예외 처리에 주의한다.



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
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
 
int t,n,m,r,c,l,map[55][55],visit[55][55],ans;
int dx[4]={0,0,1,-1},dy[4]={-1,1,0,0}; // 서 동 남 북
 
void bfs()
{
    queue<pair<int,int>> q;
    visit[r][c]=true,ans++;
    q.push({r,c});
 
    while(--l)
    {
        int size=q.size();
        while(size--)
        {
            int x=q.front().first,y=q.front().second; q.pop();
            for(int i=0;i<4;i++)
            {
                int nx=x+dx[i],ny=y+dy[i];
                if(nx<0 || nx>=|| ny<0 || ny>=|| visit[nx][ny])
                    continue;
 
                bool f=false;
                int a=map[x][y],b=map[nx][ny];
                if(a==1)
                {
                    if(i==0 && (b==1 || b==3 || b==4 || b==5))
                        f=true;
                    else if(i==1 && (b==1 || b==3 || b==6 || b==7))
                        f=true;
                    else if(i==2 && (b==1 || b==2 || b==4 || b==7))
                        f=true;
                    else if(i==3 && (b==1 || b==2 || b==5 || b==6))
                        f=true;
                }
                else if(a==2)
                {
                    if(i==2 && (b==1 || b==2 || b==4 || b==7))
                        f=true;
                    else if(i==3 && (b==1 || b==2 || b==5 || b==6))
                        f=true;
                }
                else if(a==3)
                {
                    if(i==0 && (b==1 || b==3 || b==4 || b==5))
                        f=true;
                    else if(i==1 && (b==1 || b==3 || b==6 || b==7))
                        f=true;
                }
                else if(a==4)
                {
                    if(i==1 && (b==1 || b==3 || b==6 || b==7))
                        f=true;
                    else if(i==3 && (b==1 || b==2 || b==5 || b==6))
                        f=true;
                }
                else if(a==5)
                {
                    if(i==1 && (b==1 || b==3 || b==6 || b==7))
                        f=true;
                    else if(i==2 && (b==1 || b==2 || b==4 || b==7))
                        f=true;
                }
                else if(a==6)
                {
                    if(i==0 && (b==1 || b==3 || b==4 || b==5))
                        f=true;
                    else if(i==2 && (b==1 || b==2 || b==4 || b==7))
                        f=true;
                }
                else if(a==7)
                {
                    if(i==0 && (b==1 || b==3 || b==4 || b==5))
                        f=true;
                    else if(i==3 && (b==1 || b==2 || b==5 || b==6))
                        f=true;
                }
 
                if(f) visit[nx][ny]=true,ans++,q.push({nx,ny});
            }
        }
    }
}
 
int main()
{
    scanf("%d",&t);
    for(int k=1;k<=t;k++)
    {
        scanf("%d %d %d %d %d",&n,&m,&r,&c,&l);
        for(int i=0;i<n;i++for(int j=0;j<m;j++)
            scanf("%d",&map[i][j]);
        bfs();
        printf("#%d %d\n",k,ans);
        memset(visit,0,sizeof(visit));
        ans=0;
    }
    return 0;
}
cs



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

2112 보호 필름  (0) 2018.03.22
2105 디저트 카페  (2) 2018.03.17
1952 수영장  (0) 2018.03.14
1949 등산로 조성  (4) 2018.03.14
3289 서로소 집합  (0) 2018.02.22
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday