-
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430#include<iostream>#include<queue>#include<utility>using namespace std;int r, c, sx, sy,ex,ey,hx,hy,absx,absy;char map[26][26];bool d[26][26];int dx[] = { 1,-1,0,0 };int dy[] = { 0,0,1,-1 };bool absol = false;vector<pair<int, int>> hubo;bool ST = false;bool ED = false;void bfs(int x, int y) {queue<pair<pair<int, int>,int> > q;q.push({ { x,y } ,0});d[x][y] = true;while (!q.empty()) {//cout << x << ' ' << y << '\n';int cnt = q.front().second;q.pop();for (int i = 0; i < 4; i++) {int nx = x + dx[i]; int ny = y + dy[i];if (nx >= 0 && nx < r && ny >= 0 && ny < c) {if (d[nx][ny] == false) {if (map[x][y] == 'M' || map[x][y] == 'Z') {d[nx][ny] = true;if (map[nx][ny] == '.') {q.push({ {nx,ny},cnt+1 });}else {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 1 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '1' || map[nx][ny] == '4')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 2 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}}}if (map[x][y] == '.') {if (cnt == 1) {bool hos = false;for (int j = 0; j < 4; j++) {int nnx = x + dx[j]; int nny = y + dy[j];if (nnx >= 0 && nnx < r && nny >= 0 && nny < c) {if (map[nnx][nny] != '.') {if (map[nnx][nny] == 'M') {if (!ST) {hos = true;break;}}if (map[nnx][nny] == 'Z') {if (!ED) {hos = true;break;}}if (j == 0 && (map[nnx][nny] == '|' || map[nnx][nny] == '+' || map[nnx][nny] == '2' || map[nnx][nny] == '3')) {hos = true;break;}if (j == 1 && (map[nnx][nny] == '|' || map[nnx][nny] == '+' || map[nnx][nny] == '1' || map[nnx][nny] == '4')) {hos = true;break;}if (j == 2 && (map[nnx][nny] == '-' || map[nnx][nny] == '+' || map[nnx][nny] == '4' || map[nnx][nny] == '3')) {hos = true;break;}if (j == 3 && (map[nnx][nny] == '-' || map[nnx][nny] == '+' || map[nnx][nny] == '2' || map[nnx][nny] == '1')) {hos = true;break;}}}}if(hos)hubo.push_back({ x,y });}}if (map[x][y] == '-') {if (i == 2 || i == 3) {d[nx][ny] = true;if (map[nx][ny] == '.') {q.push({ {nx,ny},cnt + 1 });}else {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 1 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 2 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}}}}if (map[x][y] == '|') {if (i == 1 || i == 0) {d[nx][ny] = true;if (map[nx][ny] == '.') {q.push({ {nx,ny},cnt + 1 });}else {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 1 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 2 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}}}}if (map[x][y] == '1') {if (i == 0 || i == 2) {d[nx][ny] = true;if (map[nx][ny] == '.') {q.push({ {nx,ny},cnt + 1 });}else {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 1 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 2 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}}}}if (map[x][y] == '2') {if (i == 1 || i == 2) {d[nx][ny] = true;if (map[nx][ny] == '.') {q.push({ {nx,ny},cnt + 1 });}else {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 1 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 2 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}}}}if (map[x][y] == '3') {if (i == 1 || i == 3) {d[nx][ny] = true;if (map[nx][ny] == '.') {q.push({ {nx,ny},cnt + 1 });}else {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 1 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 2 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}}}}if (map[x][y] == '4') {if (i == 0 ||i == 3) {d[nx][ny] = true;if (map[nx][ny] == '.') {q.push({ {nx,ny},cnt + 1 });}else {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}}}}if (map[x][y] == '+') {if (map[nx][ny] == '.') {d[nx][ny] = true;q.push({ {nx,ny},cnt + 1 });}else {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '1' || map[nx][ny] == '4')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 1 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 2 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {d[nx][ny] = true;q.push({ {nx, ny}, cnt });}}}}}}}}int main() {ios_base::sync_with_stdio(0);cin.tie(0);cin >> r >> c;for (int i = 0; i < r; i++) {for (int j = 0; j < c; j++) {cin >> map[i][j];if (map[i][j] == 'M') {sx = i; sy = j;}if (map[i][j] == 'Z'){ex = i; ey = j;}}}for (int i = 0; i < 4; i++) {int nx = sx + dx[i]; int ny = sy + dy[i];if (nx >= 0 && nx < r && ny >= 0 && ny < c) {if (map[nx][ny] != '.' &&map[nx][ny] != 'Z') {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny]=='+' || map[nx][ny] =='3' || map[nx][ny]=='2')) {ST = true;}if (i == 1 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '1' || map[nx][ny] == '4')) {ST = true;}if (i == 2 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3')) {ST = true;}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {ST = true;}}}}for (int i = 0; i < 4; i++) {int nx = ex + dx[i]; int ny = ey + dy[i];if (nx >= 0 && nx < r && ny >= 0 && ny < c) {if (i == 0 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3')) {ED = true;}if (i == 1 && (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '1')) {ED = true;}if (i == 2 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3')) {ED = true;}if (i == 3 && (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1')) {ED = true;}}}bfs(sx, sy);bool bo[4] = { false,false,false,false };int dir = 0;for (int i = 0; i < hubo.size(); i++) {bo[0] = false; bo[1] = false; bo[2] = false; bo[3] = false;dir = 0;int x = hubo[i].first; int y = hubo[i].second;//cout << x << ' ' << y << '\n';bool hu = false;for (int j = 0; j < 4; j++) {int nx = x + dx[j]; int ny = y + dy[j];if (j == 2) {if (!ST && map[nx][ny] == 'M') {bo[2] = true;dir++;}if (!ED && map[nx][ny] == 'Z') {bo[2] = true;dir++;}if (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '4' || map[nx][ny] == '3') {bo[2] = true;dir++;}}if (j== 3) {if (!ST && map[nx][ny] == 'M') {bo[3] = true;dir++;}if (!ED && map[nx][ny] == 'Z') {bo[3] = true;dir++;}if (map[nx][ny] == '-' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '1') {bo[3] = true;dir++;}}if (j == 0) {if (!ST && map[nx][ny] == 'M') {bo[0] = true;dir++;}if (!ED && map[nx][ny] == 'Z') {bo[0] = true;dir++;}if (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '2' || map[nx][ny] == '3') {bo[0] = true;dir++;}}if (j == 1) {if (!ST && map[nx][ny] == 'M') {bo[1] = true;dir++;}if (!ED && map[nx][ny] == 'Z') {bo[1] = true;dir++;}if (map[nx][ny] == '|' || map[nx][ny] == '+' || map[nx][ny] == '1' || map[nx][ny] == '4') {bo[1] = true;dir++;}}}//cout << dir << '\n';if (dir == 4) {cout << hubo[i].first + 1 << ' ' << hubo[i].second + 1 << ' ' << '+' << '\n';break;}else if(dir == 2) {if (bo[0] && bo[1]) {cout << hubo[i].first + 1 << ' ' << hubo[i].second + 1 << ' ' << '|' << '\n';break;}if (bo[2] && bo[3]) {cout << hubo[i].first + 1 << ' ' << hubo[i].second + 1 << ' ' << '-' << '\n';break;}if (bo[0] && bo[2]) {cout << hubo[i].first + 1 << ' ' << hubo[i].second + 1 << ' ' << '1' << '\n';break;}if (bo[0] && bo[3]) {cout << hubo[i].first + 1 << ' ' << hubo[i].second + 1 << ' ' << '4' << '\n';break;}if (bo[1] && bo[2]) {cout << hubo[i].first + 1 << ' ' << hubo[i].second + 1 << ' ' << '2' << '\n';break;}if (bo[1] && bo[3]) {cout << hubo[i].first + 1 << ' ' << hubo[i].second + 1 << ' ' << '3' << '\n';break;}}}return 0;}http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
SWEA의 모의테스트 문제가 생각나는 문제였다.
조금 다르지만뭐...
아마 더똑똑하게 하는방법이 있을거같하지만,
너무졸리고 생각하는것이 귀찮아서 그냥 공책에 옮겨적고 그대로 코드를 여러번치고 복사하고 붙여넣기한 400줄의 결과가아닐까...
'백준알고리즘' 카테고리의 다른 글
소수 경로 (0) 2019.10.06 연구소 (0) 2019.10.04 중량제한 (0) 2019.10.03 맥주 마시면서 걸어가기 (0) 2019.10.01 (4991) 로봇 청소기 (0) 2019.10.01