N

(SWEA c++)4615. 재미있는 오셀로 게임 본문

SW Expert Academy

(SWEA c++)4615. 재미있는 오셀로 게임

naeunchan 2020. 11. 15. 20:14
728x90
반응형

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWQmA4uK8ygDFAXj&categoryId=AWQmA4uK8ygDFAXj&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

오셀로 게임을 구현하면 된다.

조건은 둘 수 없는 곳은 두지 않는다는 좋은 조건이 있다.

 

완전탐색을 해야하는데,

우선 8방향을 검사해야 한다.

돌을 두는 위치를 기준으로 상하좌우, 좌상, 우상, 좌하, 우하 대각을 검사한다.

for문을 돌면서 turn에 따라 흑, 백돌이 결정되기 때문에

 

현재 위치가 turn에 따른 돌의 색깔과 일치하면

돌을 두는 위치 ~ 일치하는 돌의 위치까지 해당 색으로 바꿔주고 break를 통해 빠져나오도록 한다.

만약 break를 하지 않는다면 계속 바꿔나가기 때문이다.

 

#include <iostream>
#include <vector>

using namespace std;

char board[9][9];
int N, M;

void check(int x, int y, int turn)
{
    char D, C;

    if (turn == 1)
    {
        D = 'B';
        C = 'W';
    }
    else
    {
        D = 'W';
        C = 'B';
    }

    // 오른쪽 검사
    for (int i = y + 1; i <= N; i++)
    {
        if (board[x][i] == ' ')
            break;

        if (board[x][i] == D)
        {
            for (int j = y; j < i; j++)
                board[x][j] = D;
            break;
        }
    }

    // 왼쪽 검사
    for (int i = y - 1; i > 0; i--)
    {
        if (board[x][i] == ' ')
            break;

        if (board[x][i] == D)
        {
            for (int j = y; j > i; j--)
                board[x][j] = D;
            break;
        }
    }

    // 아래쪽 검사
    for (int i = x + 1; i <= N; i++)
    {
        if (board[i][y] == ' ')
            break;

        if (board[i][y] == D)
        {
            for (int j = x; j < i; j++)
                board[j][y] = D;
            break;
        }
    }

    // 위쪽 검사
    for (int i = x - 1; i > 0; i--)
    {
        if (board[i][y] == ' ')
            break;

        if (board[i][y] == D)
        {
            for (int j = x; j > i; j--)
                board[j][y] = D;
            break;
        }
    }

    // 우상대각 검사
    for (int i = x - 1, j = y + 1; i > 0 && j <= N; i--, j++)
    {
        if (board[i][j] == ' ')
            break;

        if (board[i][j] == D)
        {
            for (int k = x, l = y; k > i && l < j; k--, l++)
                board[k][l] = D;
            break;
        }
    }

    // 좌상대각 검사
    for (int i = x - 1, j = y - 1; i > 0 && j > 0; i--, j--)
    {
        if (board[i][j] == ' ')
            break;

        if (board[i][j] == D)
        {
            for (int k = x, l = y; k > i && l > j; k--, l--)
                board[k][l] = D;
            break;
        }
    }

    // 우하대각 검사
    for (int i = x + 1, j = y + 1; i <= N && j <= N; i++, j++)
    {
        if (board[i][j] == ' ')
            break;

        if (board[i][j] == D)
        {
            for (int k = x, l = y; k < i && l < j; k++, l++)
                board[k][l] = D;
            break;
        }
    }

    // 좌하대각 검사
    for (int i = x + 1, j = y - 1; i <= N && j > 0; i++, j--)
    {
        if (board[i][j] == ' ')
            break;

        if (board[i][j] == D)
        {
            for (int k = x, l = y; k < i && l > j; k++, l--)
                board[k][l] = D;
            break;
        }
    }
}

void reset()
{
    for (int i = 0; i < 9; i++)
        for (int j = 0; j < 9; j++)
            board[i][j] = ' ';
}

void play()
{
    int x, y, turn;

    for (int i = 0; i < M; i++)
    {
        cin >> y >> x >> turn;
        check(x, y, turn);
    }
}

int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;

    for (int tc = 1; tc <= t; tc++)
    {
        int wC = 0, bC = 0;

        cin >> N >> M;

        reset();
        board[N / 2][N / 2] = 'W';
        board[N / 2][N / 2 + 1] = 'B';
        board[N / 2 + 1][N / 2] = 'B';
        board[N / 2 + 1][N / 2 + 1] = 'W';

        play();

        for (int i = 1; i <= N; i++)
        {
            for (int j = 1; j <= N; j++)
            {
                if (board[i][j] == 'B')
                    bC++;
                else if (board[i][j] == 'W')
                    wC++;
            }
        }

        cout << "#" << tc << " " << bC << " " << wC << endl;
    }
    return 0;
}
728x90
반응형