2016년 4월 16일 토요일

독 확산 시간 풀이 BFS – 주석추가

  1. #include <stdio.h>
  2. #pragma warning(disable:4996)
  3. #include <queue>
  4. using namespace std;
  5. int N;//가로
  6. int M;//세로
  7. struct point
  8. {
  9. int x;
  10. int y;
  11. };
  12. point sp; //시작위치
  13. char map[1000][1000];//입력된것을 저장할 배열
  14. char sel[1000][1000]; //방문 햇는지 정보를 저장할 배열
  15. void resetsel()//방문정보를 reset할 함수. 지금은 필요 없지만 test set이 여러개 들어온다면 필요함.
  16. {
  17. for (int i = 0; i < M; i++)
  18. {
  19. for (int j = 0; j < N; j++)
  20. {
  21. sel[i][j] = 0;
  22. }
  23. }
  24. }
  25. int xx[4] = { -1, 1, 0, 0 };//4방향으로 확산하기 위한 벡터를 미리 만들어 놓습니다.
  26. int yy[4] = { 0, 0, -1, 1 };
  27. //que는 그냥 std를 씁니다.
  28. queue<point> qpoint;
  29. int Bfs()
  30. {
  31. int qsize = qpoint.size();
  32. for (int i = 0; i < qsize; i++)//현재 que에 들어있는 만큼 확산
  33. {
  34. point p = qpoint.front(); //앞에것을 가쟈오고
  35. qpoint.pop(); // 앞에것을 버립니다. 직접구현할때는 한번에 해도 됩니다.
  36. sel[p.y][p.x] = 1;
  37. for (int dir = 0; dir < 4; dir++) //확산하는 방향은 미리 정해놓은 벡터로 4방향만
  38. {
  39. point np;//새로운 포인트
  40. np.x = p.x + xx[dir];
  41. np.y = p.y+yy[dir];
  42. if (np.x < 0 || np.y < 0 || np.x >= N || np.y >= M) continue; //map범위를 벗어나면 아무것도 안합니다.
  43. if (sel[np.y][np.x] == 1) continue; //이미 방문한 곳이면 아무것도 안함.
  44. if (map[np.y][np.x] == 'B')continue; //포인트가 벽이라면 아무것도 안함.
  45. qpoint.push(np);//방문해야 하는곳이 맞다면 queue에 추가합니다.
  46. }
  47. }
  48. //모두 완료 했다면 추가된 queue가 없을겁니다. 그럼 0리턴
  49. return qpoint.size();
  50. }
  51. #define T (1)// 원래 문제는 Test Set이 여러개 들어옵니다.
  52. int main(void)
  53. {
  54. freopen("input.txt", "r", stdin);
  55. // Test Set 도 여러개고, 파일 용량이 크니, 복사하여 붙여넣기도 어렵고, 직접타이핑 넣는거는 불가능이요~
  56. //그러니 freopen은 필수..
  57. //입력 받는 부분
  58. for (int t = 0; t < T; t++)
  59. {
  60. scanf("%d %d", &N, &M);
  61. scanf("%d %d", &sp.x, &sp.y);
  62. }
  63. for (int i = 0; i < M; i++)
  64. {
  65. for (int j = 0; j < N; j++)
  66. {
  67. scanf(" %c", &map[i][j]);
  68. }
  69. }
  70. resetsel();//방문정보를 reset할 함수. 지금은 필요 없지만 test set이 여러개 들어온다면 필요함.
  71. qpoint.push(sp);//첫 시작 포인트를 넣습니다.
  72. int cnt = 0;
  73. while (Bfs()) //Bsf에서 리턴이 0 일때까지 확산합니다.
  74. {
  75. cnt++;
  76. }
  77. printf("%d", cnt);
  78. return 0;
  79. }

댓글 없음:

댓글 쓰기