이전 톱니바퀴 문제와 유사하다.
조건만 다른데
이번엔 톱니가 t개이고
회전 조건은: 옆 톱니가 회전하고 + 맞닿아있는 전극이 서로 다를 때 -> 반대 방향으로 회전한다.
현재 회전하는 톱니바퀴 좌우로 방향만 저장했다.
마지막에 방향에 따라 각 톱니바퀴를 회전시킨다.
#include <stdio.h>
#define MAX 1001
int t, k;
int arr[MAX][10];
int dirs[MAX];
using namespace std;
void turn(int row, int dir)
{
if (dir == 1)
{
int last = arr[row][7];
for (int i = 7; i >= 1; i--)
{
arr[row][i] = arr[row][i - 1];
}
arr[row][0] = last;
}
else if (dir == -1)
{
int last = arr[row][0];
for (int i = 0; i < 7; i++)
{
arr[row][i] = arr[row][i + 1];
}
arr[row][7] = last;
}
}
int main(void)
{
scanf("%d", &t);
for (int i = 1; i <= t; i++)
{
for (int j = 0; j < 8; j++)
{
scanf("%1d", &arr[i][j]);
}
}
scanf("%d", &k);
for (int i = 0; i < k; i++)
{
int target, dir;
scanf("%d%d", &target, &dir);
dirs[target] = dir;
int tmp_dir = dir;
for (int j = target + 1; j <= t; j++)
{
//이전 톱니가 회전하고 다른 반향이라면 반대 방향으로 회전
if (tmp_dir != 0 && (arr[j - 1][2] != arr[j][6]))
{
tmp_dir *= -1;
}
else //아니면 회전 안함
{
tmp_dir = 0;
}
dirs[j] = tmp_dir;
}
//target 기준 오른쪽
tmp_dir = dir;
for (int j = target - 1; j >= 1; j--)
{
if (tmp_dir != 0 && (arr[j][2] != arr[j + 1][6]))
{
tmp_dir *= -1;
}
else //아니면 회전 안함
{
tmp_dir = 0;
}
dirs[j] = tmp_dir;
}
//한꺼번에 회전 시키기
for (int j = 1; j <= t; j++)
{
turn(j, dirs[j]);
}
}
int res = 0;
for (int i = 1; i <= t; i++)
{
if (arr[i][0] == 1)
{
res++;
}
}
printf("%d", res);
return 0;
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 11780]플로이드2 (0) | 2021.04.11 |
---|---|
[백준 20056] 마법사 상어와 파이어볼 (0) | 2021.03.31 |
[백준 1248] 맞춰봐 (0) | 2021.03.01 |
[백준 16986]인싸들의 가위바위보 (0) | 2021.03.01 |
[백준 11652] 카드 (0) | 2021.02.25 |
댓글