성우리뷰
사천성 - 4방향 진행, 여기서 한 번 더 꺾는거 고려
두원공대88학번뚜뚜
2021. 10. 4. 21:38
#include<iostream>
#include <vector>
using namespace std;
int dx[] = { 0, 1, 0, -1 };
int dy[] = {1, 0, -1, 0};
int var;
struct pos {
int x, y;
};
//각 알파벳 쌍의 x, y 좌표를 저장할 벡터
vector<vector<pos>> xypos(26);
vector<string> board;
bool reachable(vector<string> board, char c, pos from, pos to, int m, int n) {
//4방향 진행시켜보기
for (int i = 0; i < 4; i++) {
int nx = from.x + dx[i];
int ny = from.y + dy[i];
while (!(nx < 0 || nx >= m || ny < 0 || ny >= n))
//.가 아니라면, 진행 불가. 브레이크
//4방향 내에 to가 있다면 true 반환
if (nx == to.x && ny == to.y) {
return true;
}
if (board[nx][ny] != '.') {
break;
}
//위아래로 이동했으면 한 번은 양옆, 양옆으로 이동했으면 한번은 위아래로 가본다
//i==0, 2일땐 위아래로, 1,3일땐 양옆으로 간것
for (int j = (i + 1) % 2; j < 4; j += 2) {
int nnx = nx + dx[j];
int nny = ny + dy[j];
while (!(nnx < 0 || nnx >= m || nny < 0 || nny >= n)) {
//위와 같은 조건.
if (nnx == to.x && nny == to.y) {
return true;
}
if (board[nnx][nny] != '.') {
break;
}
//전에 진행한 방향으로 다시 한 번 진행
nnx += dx[j];
nny += dy[j];
}
}
//전에 행한 방향으로 다시 한번 진행
nx += dx[i];
ny += dy[i];
}
}
return true;
}
string solve(int m, int n, vector<string> m_board) {
board = m_board;
//일단 board 처리 시작
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (isalpha(board[i][j])) {
var++; //총 알파벳 개수
//각 알파벳에 해당한 벡터로, {i, j} 구조체를 삽입
xypos[board[i][j] - 'A'].push_back({ i, j });
}
}
}
string answer = "";
while (true) {
bool match = false; //짝 맞춰보자
//알파벳 순으로, 가장 먼저인 문자열의 출력이 필요
for (int i = 0; i < 26; i++) {
//맞춰야 할 짝이 남아 있다면
if (!xypos[i].empty()) {
char ch = i + 'A';
pos from = xypos[i][0];
pos to = xypos[i][1];
//만약 두 알파벳이 1번 이하로 꺾어서 만날 수 있다면
if (reachable(board, ch, from, to, m, n)) {
answer += ch;
//알파벳이 있던 장소를 없앴으니 빈칸처리 한다
board[from.x][from.y] = '.';
board[to.x][to.y] = '.';
//다음으로, 그 알파벳 벡터를 clear
xypos[i].clear();
match = true;
var -= 2;
break;
}
}
}
if (!match) {
break;
}
}
if (var == 0) return answer;
return "IMPOSSIBLE";
}
int main() {
vector<string> board = { "DBA", "C*A", "CDB" };
string ans = solve(3, 3, board);
cout << ans << "\n";
return 0;
}