독 확산 시간 풀이 BFS – 주석추가
- #include <stdio.h>
 
- #pragma warning(disable:4996)
 
- #include <queue>
 
- using namespace std;
 
 
- int N;//가로
 
- int M;//세로
 
 
- struct point
 
- {
 
-   int x;
 
-   int y;
 
- };
 
- point sp; //시작위치
 
 
- char map[1000][1000];//입력된것을 저장할 배열
 
- char sel[1000][1000]; //방문 햇는지 정보를 저장할 배열
 
 
- void resetsel()//방문정보를 reset할 함수. 지금은 필요 없지만 test set이 여러개 들어온다면 필요함.
 
- {
 
-   for (int i = 0; i < M; i++)
 
-   {
 
-     for (int j = 0; j < N; j++)
 
-     {
 
-       sel[i][j] = 0;
 
-     }
 
-   }
 
- }
 
 
- int xx[4] = { -1, 1, 0, 0 };//4방향으로 확산하기 위한 벡터를 미리 만들어 놓습니다. 
 
- int yy[4] = { 0, 0, -1, 1 };
 
- //que는 그냥 std를 씁니다.
 
- queue<point> qpoint;
 
 
 
- int Bfs()
 
- {
 
-   int qsize = qpoint.size();
 
 
-   for (int i = 0; i < qsize; i++)//현재 que에 들어있는 만큼 확산
 
-   {
 
-     point p = qpoint.front(); //앞에것을 가쟈오고
 
-     qpoint.pop(); // 앞에것을 버립니다. 직접구현할때는 한번에 해도 됩니다.
 
-     sel[p.y][p.x] = 1;
 
-     for (int dir = 0; dir < 4; dir++) //확산하는 방향은 미리 정해놓은 벡터로 4방향만
 
-     {
 
-       point np;//새로운 포인트
 
-       np.x = p.x + xx[dir];
 
-       np.y = p.y+yy[dir];
 
-       if (np.x < 0 || np.y < 0 || np.x >= N || np.y >= M) continue; //map범위를 벗어나면 아무것도 안합니다.
 
-       if (sel[np.y][np.x] == 1) continue; //이미 방문한 곳이면 아무것도 안함.
 
-       if (map[np.y][np.x] == 'B')continue; //포인트가 벽이라면 아무것도 안함.
 
-       qpoint.push(np);//방문해야 하는곳이 맞다면 queue에 추가합니다.
 
-     }
 
-   }
 
-   
 
-   //모두 완료 했다면 추가된 queue가 없을겁니다. 그럼 0리턴
 
-   return qpoint.size();
 
- }
 
 
- #define T (1)// 원래 문제는 Test Set이 여러개 들어옵니다. 
 
- int main(void)
 
- {
 
-   freopen("input.txt", "r", stdin);
 
-   // Test Set 도 여러개고, 파일 용량이 크니, 복사하여 붙여넣기도 어렵고, 직접타이핑 넣는거는 불가능이요~
 
-   //그러니 freopen은 필수..
 
 
-   //입력 받는 부분
 
-   for (int t = 0; t < T; t++)
 
-   {
 
-     scanf("%d %d", &N, &M);
 
-     scanf("%d %d", &sp.x, &sp.y);
 
-   }
 
 
-   for (int i = 0; i < M; i++)
 
-   {
 
-     for (int j = 0; j < N; j++)
 
-     {
 
-       scanf(" %c", &map[i][j]);
 
-     }
 
-   }
 
 
-   resetsel();//방문정보를 reset할 함수. 지금은 필요 없지만 test set이 여러개 들어온다면 필요함.
 
 
-   qpoint.push(sp);//첫 시작 포인트를 넣습니다.
 
-   int cnt = 0;
 
-   while (Bfs()) //Bsf에서 리턴이 0 일때까지 확산합니다.
 
-   {
 
-     cnt++;
 
-   }
 
 
-   printf("%d", cnt);
 
 
-   return 0;
 
- }
 
 
 
 
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
댓글 없음:
댓글 쓰기