본문 바로가기

BOJ/C++

[BOJ] 17085. 십자가 2개 놓기

 

* 십자가를 놓을 수 있는 최대 길이를 chk[][] 에 미리 저장을 해 놓는다. 

* 십자가는 한 좌표를 중심으로 상 하 좌 우 인접한 칸으로 퍼져나간다. 

* 이 특성을 이용해서 chk에는 몇 번이나 뻗어나갔는지를 저장한다. 

* dfs(int cnt, ll res) 에는 2개의 십자가를 놓았으면 최대값을 비교하여 갱신한다. (종료조건)

 

*(0,0) ~ (n,m)까지 검사하면서 chk[][]가 1이상일 때 (== map[][] 가 # 일때) 주변을 검사하면서 십자가가 겹쳐서 생성되지 않는지 검사한다. 

*무조건 한 십자가가 크다고 정답이 되는 것은 아니기 때문에 십자가의 크기가 chk[][] 의 값보다 작더라도 dfs()를 호출해서 다른 십자가도 놓을 수 있도록 한다. (line 81)

* visited는 십자가를 놓은 자리를 표시하는데, 완벽하게 네 방향에 십자가를 놓는 경우에만 표시할 수 있도록 한다.

 

 

 

 

TC
6 12
........#...
...#....#...
...#.#######
#######.#...
##.##...#...
...#........
ans = 81

7 7
...#...
...#...
...#...
#######
...####
...#.#.
...#...
ans = 25

'BOJ > C++' 카테고리의 다른 글

[BOJ] 4378. 트ㅏㅊ;  (0) 2020.04.25
[BOJ] 9019. DSLR  (0) 2020.04.25
[BOJ] 16939. 2X2X2 큐브  (0) 2020.04.20
[BOJ] 16932. 모양 만들기  (0) 2020.04.20
[BOJ] 17822. 원판 돌리기  (0) 2020.04.19