조건에 따라 공의 움직임을 구현해주면 된다.
출발 가능 지점에서 모든 방향으로 공을 출발시켜줬다.
웜홀의 위치는 STL map을 이용해서 기록했다.
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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 | #include<iostream> #include<map> #include<vector> using namespace std; typedef pair<int, int> pii; const int dr[4] = { 0,0,1,-1 }; const int dc[4] = { 1,-1,0,0 }; int m[101][101], n; int cnt = 0, Max = 0; map<pii, pii> mp; bool forWorm[11]; //pii wormSave[11]; void process(int r, int c, int dir) { int nr = r, nc = c; //시작점 보존 while (1) { nr += dr[dir]; //방향따라 이동 nc += dc[dir]; if (!(nr < 0 || nc < 0 || nr >= n || nc >= n)) // 종료 조건 if (m[nr][nc] == -1 || (nr == r && nc == c)) break; int num = m[nr][nc]; //다음 지점 정보 if (nr < 0 || nc < 0 || nr >= n || nc >= n) { cnt++; if (dir == 0) //동쪽으로 dir = 1; else if (dir == 1) //서쪽 dir = 0; else if (dir == 2) // 남쪽 dir = 3; else //북쪽 dir = 2; } else if (num >= 1 && num <= 5) { //블록만난경우 cnt++; //점수추가 if (num == 1) { if (dir == 0) //동쪽으로 dir = 1; else if (dir == 1) //서쪽 dir = 3; else if (dir == 2) // 남쪽 dir = 0; else //북쪽 dir = 2; } else if (num == 2) { if (dir == 0) //동쪽으로 dir = 1; else if (dir == 1) //서쪽 dir = 2; else if (dir == 2) // 남쪽 dir = 3; else //북쪽 dir = 0; } else if (num == 3) { if (dir == 0) //동쪽으로 dir = 2; else if (dir == 1) //서쪽 dir = 0; else if (dir == 2) // 남쪽 dir = 3; else //북쪽 dir = 1; } else if (num == 4) { if (dir == 0) //동쪽으로 dir = 3; else if (dir == 1) //서쪽 dir = 0; else if (dir == 2) // 남쪽 dir = 1; else //북쪽 dir = 2; } else { if (dir == 0) //동쪽으로 dir = 1; else if (dir == 1) //서쪽 dir = 0; else if (dir == 2) // 남쪽 dir = 3; else //북쪽 dir = 2; } } else if (num >= 6 && num <= 10) { pii jumpTo = mp[{nr, nc}]; nr = jumpTo.first; nc = jumpTo.second; } } } int main(void) { //setbuf(stdout, NULL); ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T; cin >> T; for (int t = 1; t <= T; t++) { vector<pii> wormSave(11); cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> m[i][j]; if (m[i][j] >= 6 && m[i][j] <= 10) { if (!forWorm[m[i][j]]) { //처음 나온 웜홀 번호 forWorm[m[i][j]] = true; wormSave[m[i][j]] = { i, j }; } else { mp.insert({ { i, j }, { wormSave[m[i][j]] } }); mp.insert({ { wormSave[m[i][j]] } ,{ i, j } }); } } } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (m[i][j] != 0) continue; //빈공간에서만 시작 for (int k = 0; k < 4; k++) { //i, j 시작점 , 시작방향 k process(i, j, k); //printf("%d %d에서 %d방향으로 출발하면 결과 %d\n", i, j, k, cnt); if (cnt > Max) { Max = cnt; } //초기화할거 초기화 cnt = 0; } } } //웜홀 리스트 확인 /*for (map<pii, pii>::iterator itr = mp.begin(); itr != mp.end(); itr++) { printf("%d %d 넣으면 %d %d\n", itr->first.first, itr->first.second, itr->second.first, itr->second.second); }*/ cout << "#" << t << ' ' << Max << '\n'; //초기화 mp.clear(); wormSave.clear(); for (int i = 6; i < 11; i++) forWorm[i] = false; Max = 0; } return 0; } | cs |
'알고리즘 문제 풀이 > 삼성 SW Expert Academy' 카테고리의 다른 글
SWEA 2112: 보호 필름 (C++) (0) | 2019.10.17 |
---|---|
SWEA 1767: 프로세서 연결하기 (C++) (0) | 2019.10.17 |
SWEA 5653:줄기세포배양 (C++) (0) | 2019.10.16 |
SWEA 2117: 홈 방범 서비스 (C++) (0) | 2019.10.16 |
SWEA 2382: 미생물 격리 (C++) (0) | 2019.10.16 |