티스토리 뷰
/*
★시뮬레이션 방법사용★
★비슷 다른 문제★
거울 2344, 2151
거울2 2347
빛의 왕과 거울의 미로1
빛의 왕과 거울의 미로2
금고회사
*/
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int dx[] = { 1, -1, 0, 0 };
int dy[] = { 0, 0, 1, -1 };
int a[1000][1000];
bool c[1000][1000];
// 0 = 아래, 1 = 위, 2 = 오른쪽, 3 = 왼쪽
int change_dir(int dir, int mirror) {
if (mirror == 1) { // 좌측 하단으로 45도
// 0 -> 3, 1 -> 2, 2 -> 1, 3 -> 0
return 3 - dir;
}
else { // 우측 하단으로 45도
// 0 -> 2, 1 -> 3, 2 -> 0, 3 -> 1
return (dir + 2) % 4;
}
}
int main() {
int t;
scanf("%d", &t);
for (int tc = 1; tc <= t; tc++) {
int n;
scanf("%d", &n);
for (int i = 0; i<n; i++) {
for (int j = 0; j<n; j++) {
scanf("%1d", &a[i][j]);
c[i][j] = false;
}
}
int row, col, dir;
row = 0;
col = 0;
dir = 2;
// dir
// 0 = 아래, 1 = 위, 2 = 오른쪽, 3 = 왼쪽
while (0 <= row && row < n && 0 <= col && col < n) {
if (a[row][col] != 0) {
c[row][col] = true;
dir = change_dir(dir, a[row][col]);
}
row += dx[dir];
col += dy[dir];
}
int ans = 0;
for (int i = 0; i<n; i++) {
for (int j = 0; j<n; j++) {
if (c[i][j]) {
ans += 1;
}
}
}
printf("Case #%d\n", tc);
printf("%d\n", ans);
}
return 0;
}
'프로그래밍 > 알고리즘' 카테고리의 다른 글
개구리 뛰기(codeground) (0) | 2016.11.26 |
---|---|
균일수(codeground) (0) | 2016.11.26 |
편집 거리 알고리즘 및 LCS문제 (0) | 2016.11.26 |
위상정렬로 문제풀기 (0) | 2016.11.22 |
소수의 곱(우선순위 큐) (0) | 2016.11.22 |