티스토리 뷰
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>=n || ny<0 || ny>=m || 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 |