단위 정육각형 이루어져 있는 지도가 주어졌을 때, 해변의 길이를 구하는 프로그램을 작성하시오.
해변은 정육각형의 변 중에서 한 쪽은 물인데, 한 쪽은 땅인 곳을 의미한다.
첫째 줄에 지도의 세로 크기 N과 가로 크기 M이 주어진다. (1 ≤ N, M ≤ 50)
둘째 줄부터 N개의 줄에 지도가 주어진다. '.'은 물, '#'은 땅이다.
첫째 줄에 해변의 길이를 출력한다.
https://www.acmicpc.net/problem/14397
땅위치를 행과 열로 나타낸다면,
짝수 행일때와 홀수 행일때, 각 인접한 6개의 땅의 상대적인 위치가 각기다르다. 이것을 구현하여,
모든땅에서 인접한 6개를 검토하여 결과를 내면 된다.
(0,2) 에서 나타낸 좌표가 짝수행 일때, (1,4)에서 나타낸 좌표가 홀수행일때 각 인접한 6개의 상대적 위치이다.
이런식으로 모든 땅을 검토하여 결과를 출력하면된다.
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using std::vector; using std::pair; typedef pair<int, int> pii;
int n, m, **map; //1 : 땅 0: 물
vector<pii> land; //땅의 위치를 기록
int dx1[] = { -1, -1, 0, +1, +1, 0 };
int dx2[] = { -1, -1, 0, +1, +1, 0 };
int dy1[] = { -1, 0, +1, 0, -1, -1 };
int dy2[] = { 0, +1, +1, +1, 0, -1};
int res = 0;
void init() {
scanf("%d%d", &n, &m);
map = new int* [n];
for (int i = 0; i < n; i++) {
map[i] = new int[m];
char c;
scanf("%c", &c);
for (int j = 0; j < m; j++) {
scanf("%c", &c);
if (c == '.')
map[i][j] = 0;
else if (c == '#') {
map[i][j] = 1;
land.push_back({ i, j });
}
}
}
}
void logic() {
for (int i = 0; i < land.size(); i++) {
int x = land[i].first;
int y = land[i].second;
for (int dir = 0; dir < 6; dir++) {
int xx;
int yy;
if (x % 2 == 0) { //짝수 행
xx = x + dx1[dir];
yy = y + dy1[dir];
}
else { //홀수 행
xx = x + dx2[dir];
yy = y + dy2[dir];
}
if (xx < 0 || yy < 0 || xx == n || yy == m)
continue;
if (map[xx][yy] == 0)
res++;
}
}
printf("%d", res);
}
int main(void) {
init();
logic();
return 0;
}