티스토리 뷰
https://www.acmicpc.net/problem/15683
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 | #include <cstdio> #include <vector> #include <algorithm> using namespace std; int n,m,cnt,ans=100,map[8][8],tmap[8][8]; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; // 북동남서 vector<pair<pair<int,int>,pair<int,int>>> v; int size,p[8]; void go(int x,int y,int d) { while(true) { int nx=x+dx[d],ny=y+dy[d]; if(nx<0 || nx>=n || ny<0 || ny>=m || tmap[nx][ny]==6) break; tmap[nx][ny]=-1; x=nx,y=ny; } } void solve() { cnt=0; for(int i=0;i<n;i++) for(int j=0;j<m;j++) tmap[i][j]=map[i][j]; for(int i=0;i<size;i++) { int t=v[i].first.first; int d=p[i]; int x=v[i].second.first; int y=v[i].second.second; if(t==1) go(x,y,d); else if(t==2) go(x,y,d),go(x,y,d+2); else if(t==3) go(x,y,d),go(x,y,d==3?0:d+1); else if(t==4) { if(d==0) go(x,y,3),go(x,y,0),go(x,y,1); else if(d==3) go(x,y,2),go(x,y,3),go(x,y,0); else go(x,y,d-1),go(x,y,d),go(x,y,d+1); } else { for(int j=0;j<4;j++) go(x,y,j); } } for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(!tmap[i][j]) cnt++; ans=min(ans,cnt); } void make(int idx) { if(idx==size) { solve(); return; } int range=v[idx].first.second; for(int i=0;i<range;i++) p[idx]=i,make(idx+1); } int main() { scanf("%d %d",&n,&m); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { scanf("%d",&map[i][j]); int t=map[i][j]; if(t>=1 && t<=5) { v.push_back({{t,t==2?2:4},{i,j}}); size++; } } } make(0); printf("%d\n",ans); return 0; } | cs |
'Algorithm > BOJ' 카테고리의 다른 글
11562 백양로 브레이크 (0) | 2018.09.12 |
---|---|
2458 키 순서 (0) | 2018.09.12 |
3474 교수가 된 현우 (0) | 2018.09.06 |
3176 도로 네트워크 (0) | 2018.09.05 |
11438 LCA 2 (0) | 2018.09.05 |