상세 컨텐츠

본문 제목

5650. [모의 SW 역량테스트] 핀볼 게임

알고리즘/SWExpertAcademy

by 아리따운노을 2020. 3. 9. 23:12

본문

 

설명은 일단 귀찮으니 다음에

일단 코드만

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
 
using namespace std;
 
 
int n,ans,ret, first_x, first_y;
int mX[] = {-1100}, mY[] = {00-11},MAP[101][101], rev[] = {1,0,3,2};
int change_dir[6][4= {
    {0,0,0,0},
    {1,3,0,2},
    {3,0,1,2},
    {2,0,3,1},
    {1,2,3,0},
    {1,0,3,2}
};
 
vector<pair<intint > >V[5];
queue<pair<intint > >Q;
 
 
void solve(int x, int y, int dir)
{
    while(1)
    {
        int nx = x + mX[dir], ny = y + mY[dir];
        
        if(1<= MAP[nx][ny] && MAP[nx][ny]<=5)
        {
            ret++;
            dir = change_dir[MAP[nx][ny]][dir];
        }
        
        if(6 <= MAP[nx][ny] && MAP[nx][ny] <= 10)
        {
            for(int i=0;i<V[MAP[nx][ny]-6].size(); i++)
            {
                if(V[MAP[nx][ny]-6][i].first != nx || V[MAP[nx][ny]-6][i].second != ny)
                {
                    x = V[MAP[nx][ny]-6][i].first;
                    y = V[MAP[nx][ny]-6][i].second;
                    break;
                }
            }
            continue;
        }
        if(nx<1||ny<1||nx>n||ny>n)
        {
            ret++;
            dir = rev[dir];
        }
        x = nx, y = ny;
        if(x == first_x && y == first_y) return;
        if(MAP[x][y]==-1return;
 
    }
 
}
int main()
{
//    ios_base::sync_with_stdio(0);
//    cin.tie(0);
//    cout.tie(0);
    int tc;
    scanf("%d"&tc);
    for(int t=1;t<=tc;t++)
    {
        memset(MAP, -2sizeof(MAP));
        scanf("%d"&n);
        ans = 0;
        for(int i=0;i<5;i++)
            V[i].clear();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%d"&MAP[i][j]);
                if(MAP[i][j] >= 6 && MAP[i][j] <=10)
                    V[MAP[i][j]-6].push_back(make_pair(i,j));
                else if(MAP[i][j] == 0)
                    Q.push(make_pair(i,j));
            }
        }
        while(!Q.empty())
        {
            int x = Q.front().first;
            int y = Q.front().second;
            first_x = x;
            first_y = y;
            Q.pop();
            for(int i=0;i<4;i++)
            {
                ret = 0;
                solve(x,y,i);
                ans = ret > ans ? ret : ans;
            }
 
        }
        printf("#%d %d\n", t, ans);
    }
    return 0;
}
 
cs

관련글 더보기

댓글 영역