반응형
문제 출처 :
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(5, 8)); 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(5, 5)); // 왼쪽으로 회전 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 >= 0 && 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] = { 1, 0, -1, 0 }; int py[4] = { 0, 1, 0, -1 }; 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 < 0 || x > n || y < 0 || y > n) { puts("-1"); return 0; } } else if (t) z = z + 3 & 3; else z = z + 1 & 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 |