알고리즘/koitp

koitp SDS_TEST_SURVIVOR 마지막생존자

꾸준함. 2018. 7. 28. 03:43

문제 링크입니다: 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


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형