Search
Duplicate
📗

늑대와 양

주차
문제번호
16956
언어
C++
티어
실버
유형
애드 혹
해 구성하기
BFS
DFS
nj_Blog
nj_상태
이해도
100%
풀이
사람
이해도 2
13 more properties

문제접근

dfs

놓쳤던 부분

입력을 받는 동시에 그 지점이 W이면 4방위를 살펴보고 S가 있으면 0을 출력하게 했었는데, 동시에 진행을 할 경우 입력을 다 받아둔 상태가 아니기 때문에 아직 입력받지 않은 부분까지 체크를 하게 되어 W주변에 S가 있는지 확인이 제대로 이루어지지 않는다.
입력 부분과 검증 부분을 분리해야함

코드

4016 KB

12 ms

#include <iostream> #include <vector> #include <utility> #include <string> using namespace std; int r,c; int dx[4] = {0, 1, 0, -1}; int dy[4] = {-1, 0, 1, 0}; vector<vector<char> > board; void dfs(int row, int col) { for (int i = 0; i < 4; i++) { int nextRow = row + dy[i]; int nextCol = col + dx[i]; if (nextRow < 0 || nextRow >= r || nextCol < 0 || nextCol >= c) continue ; if (board[nextRow][nextCol] == '.') { board[nextRow][nextCol] = 'D'; dfs(nextRow, nextCol); } } } int main(void) { string input; vector<pair<int, int> > wolfPosition; ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> r >> c; board.resize(r, vector<char>(c)); for (int i = 0; i < r; i++) { cin >> input; for (int j = 0; j < c; j++) { board[i][j] = input[j]; } } for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { if (board[i][j] == 'W') { for (int k = 0; k < 4; k++) { int nx = j + dx[k]; int ny = i + dy[k]; if (ny < 0 || ny >= r || nx < 0 || nx >= c) continue ; if (board[ny][nx] == 'S') { cout << "0"; return (0); } } wolfPosition.push_back({i, j}); } } } for (unsigned int i = 0; i < wolfPosition.size(); i++) { dfs(wolfPosition[i].first, wolfPosition[i].second); } cout << "1\n"; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { cout << board[i][j]; } cout << "\n"; } return (0); }
C++
복사