티스토리 뷰
https://www.acmicpc.net/problem/14891
K번 톱니바퀴를 회전시킨 후 점수의 합을 구하는 문제이다. 매번 톱니바퀴를 돌리면 서로 맞닿은 극이 다를 경우에만 회전하게 된다. 현재 상태를 기준으로 다음 회전할 방향을 미리 저장한 후 move함수를 이용하여 상태를 변화시킨다.
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 | #include <cstdio> #include <cstring> // w[i][j]: i번째 톱니바퀴의 j번째 점수 // nd[i]: i번째 톱니바퀴의 다음 이동 방향 int w[5][9],nd[5],k,n,d; int sum() { int s=0; for(int i=1,j=1;i<=4;i++,j*=2) if(w[i][1]) s+=j; return s; } void move() { for(int i=1;i<=4;i++) { if(nd[i]==1) { int t=w[i][8]; for(int j=8;j>=2;j--) w[i][j]=w[i][j-1]; w[i][1]=t; } else if(nd[i]==-1) { int t=w[i][1]; for(int j=1;j<=7;j++) w[i][j]=w[i][j+1]; w[i][8]=t; } } } int rd(int d) { if(d==1) return -1; else return 1; } int main() { for(int i=1;i<=4;i++) for(int j=1;j<=8;j++) scanf("%1d",&w[i][j]); scanf("%d",&k); while(k--) { memset(nd,0,sizeof(nd)); scanf("%d %d",&n,&d); nd[n]=d; if(n==1) { for(int i=2;i<=4;i++) { if(w[i][7]!=w[i-1][3]) nd[i]=rd(nd[i-1]); else break; } } else if(n==2) { if(w[1][3]!=w[2][7]) nd[1]=rd(nd[2]); for(int i=3;i<=4;i++) { if(w[i][7]!=w[i-1][3]) nd[i]=rd(nd[i-1]); else break; } } else if(n==3) { if(w[3][3]!=w[4][7]) nd[4]=rd(nd[3]); for(int i=2;i>=1;i--) { if(w[i][3]!=w[i+1][7]) nd[i]=rd(nd[i+1]); else break; } } else if(n==4) { for(int i=3;i>=1;i--) { if(w[i][3]!=w[i+1][7]) nd[i]=rd(nd[i+1]); else break; } } move(); } printf("%d\n",sum()); return 0; } | cs |
'Algorithm > BOJ' 카테고리의 다른 글
15685 드래곤 커브 (3) | 2018.04.16 |
---|---|
15686 치킨 배달 (0) | 2018.04.16 |
14890 경사로 (0) | 2018.04.09 |
14889 스타트와 링크 (0) | 2018.04.09 |
14888 연산자 끼워넣기 (0) | 2018.04.09 |