* 십자가를 놓을 수 있는 최대 길이를 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 |