[SWEA] 5650번 핀볼 게임 C++

semi·2022년 10월 13일
0

coding test

목록 보기
55/57

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo

#define _CRT_SECURE_NO_WARNINGS
 
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <map>
#include <vector>
using namespace std;
 
int N;
int board[101][101] = { 0, };
int direct[4][2] = { {0, 1}, {0, -1}, {1, 0}, {-1, 0} };
int max_val = 0;
int sum_val = 0;
 
struct warmhole {
    int i, j;
};
 
 
 
int main(int argc, char** argv)
{
    int T;
    int test_case;
    //freopen("sample_input.txt", "r", stdin);
    cin >> T;
    for (test_case = 1; test_case <= T; ++test_case)
    {
        memset(board, 0, sizeof(board));
        map<int, vector<warmhole>> m;
        max_val = 0;
        sum_val = 0;
        cin >> N;
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                cin >> board[i][j];
                if (board[i][j] >= 6 && board[i][j] <= 10)
                {
                    m[board[i][j]].push_back({ i, j });
                }
            }
        }
     
        for (int cur_i = 0; cur_i < N; cur_i++)
        {
            for (int cur_j = 0; cur_j < N; cur_j++)
            {
                if (board[cur_i][cur_j] != 0)
                    continue;
                 
                int ni, nj;
                int cur_x, cur_y;
                for (int d = 0; d < 4; d++)
                {
                    cur_x = direct[d][0];
                    cur_y = direct[d][1];
                    ni = cur_i + cur_y;
                    nj = cur_j + cur_x;
                    sum_val = 0;
                    while (1)
                    {
                        if (sum_val > max_val)
                            max_val = sum_val;
                        if (ni < 0 || ni >= N || nj < 0 || nj >= N) // 벽
                        {
                            sum_val++;
                            cur_x *= -1;
                            cur_y *= -1;
                            ni += cur_y;
                            nj += cur_x;
                        }
                        else if (ni == cur_i && nj == cur_j) // 종료
                            break;
                        else if (board[ni][nj] == -1) // 블랙홀
                            break;
                        else if (board[ni][nj] >= 6 && board[ni][nj] <= 10) // 웜홀
                        {
                            if (ni == m[board[ni][nj]][0].i && nj == m[board[ni][nj]][0].j)
                            {
                                int new_ni = m[board[ni][nj]][1].i;
                                int new_nj = m[board[ni][nj]][1].j;
 
                                ni = new_ni + cur_y;
                                nj = new_nj + cur_x;
                            }
                            else
                            {
                                int new_ni = m[board[ni][nj]][0].i;
                                int new_nj = m[board[ni][nj]][0].j;
 
                                ni = new_ni + cur_y;
                                nj = new_nj + cur_x;
                            }
                        }
                        else if (board[ni][nj] >= 1 && board[ni][nj] <= 5) // 블록
                        {
                            sum_val++;
                            if (board[ni][nj] == 1)
                            {
                                if ((cur_x == 1 && cur_y == 0) || (cur_x == 0 && cur_y == -1))
                                {
                                    cur_x *= -1;
                                    cur_y *= -1;
                                }
                                else
                                {
                                    int tmp;
                                    tmp = cur_x;
                                    cur_x = cur_y;
                                    cur_y = tmp;
                                }
                            }
                            else if (board[ni][nj] == 2)
                            {
                                if ((cur_x == 1 && cur_y == 0) || (cur_x == 0 && cur_y == 1))
                                {
                                    cur_x *= -1;
                                    cur_y *= -1;
                                }
                                else
                                {
                                    cur_x *= -1;
                                    cur_y *= -1;
                                    int tmp;
                                    tmp = cur_x;
                                    cur_x = cur_y;
                                    cur_y = tmp;
                                }
                            }
                            else if (board[ni][nj] == 3)
                            {
                                if ((cur_x == 0 && cur_y == 1) || (cur_x == -1 && cur_y == 0))
                                {
                                    cur_x *= -1;
                                    cur_y *= -1;
                                }
                                else
                                {
                                    int tmp;
                                    tmp = cur_x;
                                    cur_x = cur_y;
                                    cur_y = tmp;
                                }
                            }
                            else if (board[ni][nj] == 4)
                            {
                                if ((cur_x == -1 && cur_y == 0) || (cur_x == 0 && cur_y == -1))
                                {
                                    cur_x *= -1;
                                    cur_y *= -1;
                                }
                                else
                                {
                                    cur_x *= -1;
                                    cur_y *= -1;
                                    int tmp;
                                    tmp = cur_x;
                                    cur_x = cur_y;
                                    cur_y = tmp;
                                }
                            }
                            else if (board[ni][nj] == 5)
                            {
                                cur_x *= -1;
                                cur_y *= -1;
                                 
                            }
                            ni += cur_y;
                            nj += cur_x;
                        }
                        else if (board[ni][nj] == 0) // 방향 유지
                        {
                            ni += cur_y;
                            nj += cur_x;
                        }
 
                    }
                }
            }
        }
        cout << "#" << test_case << " " << max_val << endl;
    }
 
         
    return 0;
}

0개의 댓글