배달
*visited를 4차원 배열로 선언 X좌표 / Y좌표 / 방향 / S와 C를 방문한 상태 *상태표시는 비트마스크를 사용해서 S까지 총 2^3개를 만들면 된다. *C에 도착했을 때 status가 111 이면 배달을 마친 상태이다. (최소값 찾기) *큐에는 4가지 정보를 모두 저장해서 이전에 방문했던 방향으로 다시 가지 않도록 한다. #include #include #include #include #define INF 987654321 using namespace std; int n, m, ans = INF; char map[51][51]; typedef pair pp; pp start, dest1, dest2; int dx[5] = { 0,0,0,-1,1 }, dy[5] = {0, -1,1,0,0 }; ..
적록색약
*RGB에 따라 구역을 라벨링한다. (적록색약이 아닌 사람이 보는 영역들) *G-> R로 바꾼 후에 구역을 라벨링한다. (적록색약인 사람이 보는 영역들) *맵을 변경하지 않고 인접하는 영역 중 RG인 것들을 만나면 영역의 개수를 줄여주는 방식으로 풀려고 했는데 (주석처리된 부분) 왜 안되는 지 모르겠다.. #include #include #include using namespace std; int n; char map[101][101]; bool visited[101][101]; int dx[4] = { -1,1,0,0 }, dy[4] = { 0,0,-1,1 }; void dfs(int x, int y, char now, int label) { if (visited[x][y]) return; visite..
사탕게임
*(0,0)부터 차례대로 순회하면서 동쪽, 남쪽의 사탕들과 자리를 바꾼다. (swap) *바꾼 상태에서 맵을 쭉 살펴보면서 가장 긴 수열이 나오는지 확인한다. (바뀐 부분이 속한 행과 열만 살펴보게 되면 예외케이스를 처리할 수 없다. 다른 곳에서 예기치 못하게 긴 수열이 나올 수 있기 때문에) #include #include #include #include using namespace std; int n; char map[51][51]; int dx[2] = { 1,0 }, dy[2] = { 0,1 }; int cdx[4] = { -1,1,0,0 }, cdy[4] = { 0,0, 1,-1 }; typedef pair pp; bool visited[51][51]; int check() { memset(vi..