- #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;
- }
2016년 4월 16일 토요일
독 확산 시간 풀이 BFS – 주석추가
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기