문제 링크입니다: https://koitp.org/problem/SDS_TEST_SURVIVOR/read/
간단한 브루트 포스(Brute Force) 문제였습니다.
알고리즘은 아래와 같습니다.
1. 반복문을 통해 모든 인덱스를 통해 8 방향 중 범위 초과가 아닌 인덱스만 확인합니다.
2. 1번에서 확인한 인덱스들이 불모지가 없고 초원, 산, 물이 모두 있다면 도시를 세울 수 있습니다.
*문제는 마치 8 방향을 모두 확인할 수 있는 땅만 확인하라는 식으로 적혀 있지만 실제로는 그냥 범위 초과가 아닌 인덱스를 확인하는 것을 요구하기 때문에 모든 땅을 확인해야합니다.
#include <iostream>
using namespace std;
const int MAX = 10;
typedef struct
{
int y, x;
}Dir;
Dir moveDir[8] = { {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1} };
int N;
int ground[MAX][MAX];
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0); //cin 실행속도 향상
int test_case;
cin >> test_case;
for (int i = 1; i <= test_case; i++)
{
cin >> N;
for (int j = 0; j < N; j++)
for (int k = 0; k < N; k++)
cin >> ground[j][k];
int cnt = 0;
for (int j = 0; j < N; j++)
{
for (int k = 0; k < N; k++)
{
bool water = false;
bool mountain = false;
bool field = false;
bool wasteland = false;
switch (ground[j][k])
{
case 0:
wasteland = true;
break;
case 1:
water = true;
break;
case 2:
mountain = true;
break;
case 3:
field = true;
break;
}
for (int l = 0; l < 8; l++)
{
int nextY = j + moveDir[l].y;
int nextX = k + moveDir[l].x;
if (0 <= nextY && nextY < N && 0 <= nextX && nextX < N)
{
switch (ground[nextY][nextX])
{
case 0:
wasteland = true;
break;
case 1:
water = true;
break;
case 2:
mountain = true;
break;
case 3:
field = true;
break;
}
}
}
if (!wasteland && water && mountain && field)
cnt++;
}
}
cout << "#" << i << " " << cnt << "\n";
}
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > koitp' 카테고리의 다른 글
koitp SDS_TEST_BIGINT 큰수만들기 (0) | 2018.07.28 |
---|---|
koitp SDS_TEST_TREASURE 보물찾기 (0) | 2018.07.28 |
koitp SDS_TEST_PAGE 쉬어가는페이지 (0) | 2018.07.28 |
koitp SDS_TEST_CONSULTING 전화상담 (0) | 2018.07.28 |
koitp SDS_TEST_SPACE 순환공간 (0) | 2018.07.27 |