반응형

문제 출처 :


https://www.acmicpc.net/problem/13567



알고리즘 분석 :


문제 해결에 필요한 사항

1. Simulation


2016년 11월 05일 ACM-ICPC 한국 대표 선발전 '제16회 대학생프로그래밍 경시대회' 문제이다.


가장 쉬운 문제중 하나이고, 시뮬레이션을 통한 해결이 가능하다.


시뮬레이션이란 ? 요구조건에 맞게 순서대로 소스코드를 짜면 정상 작동한다는 의미이다.


dir 변수와 pos 변수를 이용하여 해결하였고,  두번째 소스코드는 숏코딩으로 제작된 코드이다.



소스 코드 : 


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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    int n, m;
    int x = 0, y = 0;
    int finish;
 
    int dirX = 1, dirY = 1// dirX = 1 :: +x  //  dirx = -1 :: -x
    int pos = 0// pos = 0 :: move x  // pos = 1 :: move y
    string str;
    int val, flag = 0;
 
    cin >> n >> m;
 
    while (getchar() != '\n') {}
    for (int i = 0; i < m; i++)
    {
        str.clear();
        getline(cin,str);
 
 
        if (str[0== 'M')
        {
            val = stoi(str.substr(58));
 
            for (int i = 0; i < val; i++)
            {
                // X축으로 움직일 때
                if (pos == 0)
                {
                    // + 방향이면
                    if (dirX == 1)
                        x++;
                    // - 방향이면
                    else
                        x--;
                }
                // Y축으로 움직일 때
                else if (pos == 1)
                {
                    // + 방향이면
                    if (dirY == 1)
                        y++;
 
                    // - 방향이면
                    else
                        y--;
                }
                    
 
                if (x > n || y > n)
                {
                    flag = 1;
                }
            }
        }
 
 
        if (str[0== 'T')
        {
            val = stoi(str.substr(55));
            // 왼쪽으로 회전
            if (val == 0)
            {
                // X축으로 움직일 때
                if (pos == 0)
                {
                    // + 방향이면
                    if (dirX == 1)
                        pos = 1, dirY = 1;
                    // - 방향이면
                    else
                        pos = 1, dirY = -1;
                }
 
                // Y축으로 움직일 때
                else if (pos == 1)
                {
                    // + 방향이면
                    if (dirY == 1)
                        pos = 0, dirX = -1;
                    // - 방향이면
                    else
                        pos = 0, dirX = 1;
                }
            }
 
 
            // 오른쪽으로 회전
            if (val == 1)
            {
                // X축으로 움직일 때
                if (pos == 0)
                {
                    // + 방향이면
                    if (dirX == 1)
                        pos = 1, dirY = -1;
                    // - 방향이면
                    else
                        pos = 1, dirY = 1;
                }
 
                // Y축으로 움직일 때
                else if (pos == 1)
                {
                    // + 방향이면
                    if (dirY == 1)
                        pos = 0, dirX = 1;
                    // - 방향이면
                    else
                        pos = 0, dirX = -1;
                }
            }
        }
 
 
    }
 
    if (flag == 0)
    {
        if (x >= && y >= 0)
            cout << x << " " << y << endl;
 
        else
            cout << "-1" << endl;
    }
    else
        cout << "-1" << endl;
 
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus





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
#include <cstdio>
 
char s[8];
int px[4= { 10-1};
int py[4= { 010-};
 
int main() {
    int x, y, z;
    int n, m, t;
    x = y = z = 0;
    scanf("%d%d"&n, &m);
    while (m--) {
        scanf("%s%d", s, &t);
        if (s[0== 'M') {
            x += px[z] * t;
            y += py[z] * t;
            if (x < || x > n || y < || y > n) {
                puts("-1");
                return 0;
            }
        }
        else if (t) z = z + & 3;
        else z = z + & 3;
    }
    printf("%d %d", x, y);
    return 0;
}                                             

Crocus



반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[11727번] 2xn 타일링 2  (0) 2016.11.07
[1707번] 이분 그래프  (0) 2016.11.07
[13414번] 수강신청  (0) 2016.11.06
[2643번] 색종이 올려 놓기  (2) 2016.11.06
[1120번] 문자열  (0) 2016.11.06