티스토리 뷰
https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV597vbqAH0DFAVl
실제로 시뮬레이션을 해본다. 매 시간마다 상하좌우에서 현재 위치로 오는 미생물들을 검사하고 다음 상태를 저장한다. 가장자리에서의 예외 처리, 모든 경우의 수 처리, 테스트 케이스마다 초기화에 유의하자.
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 | #include <cstdio> int t,n,m,k,map[100][100][2],tmap[100][100][2],ans; int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; // 하상우좌 void solve() { while(m--) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { int sum=0,t=0,d=0; bool f=false; for(int k=0;k<4;k++) { int nx=i+dx[k],ny=j+dy[k]; int &S=map[nx][ny][0],&D=map[nx][ny][1]; if(nx<0 || nx>=n || ny<0 || ny>=n || !S) continue; if((D==1 && k==0) || (D==2 && k==1) || (D==3 && k==2) || (D==4 && k==3)) { f=true; sum+=S; if(t<S) t=S,d=D; } } if(!f) continue; if(i==0 || i==n-1 || j==0 || j==n-1) { sum/=2; if(d==1 || d==3) d++; else d--; } tmap[i][j][0]=sum; tmap[i][j][1]=d; } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { map[i][j][0]=tmap[i][j][0]; map[i][j][1]=tmap[i][j][1]; tmap[i][j][0]=tmap[i][j][1]=0; } } } ans=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { ans+=map[i][j][0]; map[i][j][0]=map[i][j][1]=0; } } } int main() { scanf("%d",&t); for(int T=1;T<=t;T++) { scanf("%d %d %d",&n,&m,&k); while(k--) { int a,b,c,d; scanf("%d %d %d %d",&a,&b,&c,&d); map[a][b][0]=c; map[a][b][1]=d; } solve(); printf("#%d %d\n",T,ans); } return 0; } | cs |
'Algorithm > SW Expert Academy' 카테고리의 다른 글
1249 보급로 (0) | 2018.03.27 |
---|---|
4050 재관이의 대량 할인 (0) | 2018.03.27 |
2117 홈 방범 서비스 (0) | 2018.03.24 |
2115 벌꿀채취 (0) | 2018.03.24 |
2112 보호 필름 (0) | 2018.03.22 |