공부/SWEA

SWEA 11315. 오목 판정 (C++)

밤톨ㅇl 2024. 5. 8. 01:30
#include <stdio.h>

using namespace std;

int N;
int dx[8] = {0,0,1,-1,-1,1,-1,1};
int dy[8] = {-1,1,0,0,1,1,-1,-1};
char omok[20][20];

bool solve(int x, int y)
{
    int cx = x;
    int cy = y;

    for (int i = 0; i < 8; i++)
    {
        bool flag = true;

        int nx = cx + dx[i];
        int ny = cy + dy[i];

        if (nx < 0 || ny < 0 || nx >= N || ny >= N || omok[nx][ny] == '.')
            continue;

        for (int j = 0; j < 3; j++) // (cx, cy)와 (nx, ny)에 o가 있기때문에 3번 반복
        {
            nx = nx + dx[i];
            ny = ny + dy[i];

            if (nx < 0 || ny < 0 || nx >= N || ny >= N || omok[nx][ny] == '.')
            {
                flag = false;
                break;
            }
        }
        if (flag)
            return true;
    }
    return false;
}

int main()
{
    int tc = 0;
    scanf("%d", &tc);
    for (int t = 1; t <= tc; t++)
    {
        bool flag = false;

        scanf("%d", &N);
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                scanf(" %c", &omok[i][j]);
            }
        }
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                if (omok[i][j] == 'o' && solve(i, j))
                    flag = true;
                if(flag)
                	break;
            }
            if(flag)
           		break;
        }
        if (flag)
            printf("#%d YES\n", t);
        else
            printf("#%d NO\n", t);
    }
    return 0;
}

1. 8방향으로 o가 있는지 탐색

2. 탐색이 한번이라도 성공하면 return true

3. 끝!!

'공부 > SWEA' 카테고리의 다른 글

SWEA 19113. 식료품 가게 (C++)  (0) 2024.05.10
SWEA 9839. 최고의 쌍 (C++)  (0) 2024.05.08
SWEA 9778. 카드 게임 (C++)  (0) 2024.05.06
SWEA 3975. 승률 비교하기 (C++)  (0) 2024.05.06
SWEA 5986. 새샘이와 세 소수 (C++)  (0) 2024.05.06