๋ฌธ์
H*W ํฌ๊ธฐ์ ๊ฒ์ํ์ด ์์ต๋๋ค. ๊ฒ์ํ์ ๊ฒ์ ์นธ๊ณผ ํฐ ์นธ์ผ๋ก ๊ตฌ์ฑ๋ ๊ฒฉ์ ๋ชจ์์ ํ๊ณ ์๋๋ฐ ์ด ์ค ๋ชจ๋ ํฐ ์นธ์ 3์นธ์ง๋ฆฌ L์ ๋ชจ์์ ๋ธ๋ก์ผ๋ก ๋ฎ๊ณ ์ถ์ต๋๋ค. ์ด ๋ ๋ธ๋ก๋ค์ ์์ ๋กญ๊ฒ ํ์ ํด์ ๋์ ์ ์์ง๋ง, ์๋ก ๊ฒน์น๊ฑฐ๋, ๊ฒ์ ์นธ์ ๋ฎ๊ฑฐ๋, ๊ฒ์ํ ๋ฐ์ผ๋ก ๋๊ฐ์๋ ์ ๋ฉ๋๋ค. ์ ๊ทธ๋ฆผ์ ํ ๊ฒ์ํ๊ณผ ์ด๋ฅผ ๋ฎ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
๊ฒ์ํ์ด ์ฃผ์ด์ง ๋ ์ด๋ฅผ ๋ฎ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์ ๋ ฅ
๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ์ C (C <= 30) ๊ฐ ์ฃผ์ด์ง๋๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ ์ค์๋ 2๊ฐ์ ์ ์ H, W (1 <= H,W <= 20) ๊ฐ ์ฃผ์ด์ง๋๋ค. ๋ค์ H ์ค์ ๊ฐ W ๊ธ์๋ก ๊ฒ์ํ์ ๋ชจ์์ด ์ฃผ์ด์ง๋๋ค. # ์ ๊ฒ์ ์นธ, . ๋ ํฐ ์นธ์ ๋ํ๋ ๋๋ค. ์ ๋ ฅ์ ์ฃผ์ด์ง๋ ๊ฒ์ํ์ ์๋ ํฐ ์นธ์ ์๋ 50 ์ ๋์ง ์์ต๋๋ค.
์ถ๋ ฅ
ํ ์ค์ ํ๋์ฉ ํฐ ์นธ์ ๋ชจ๋ ๋ฎ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์์ ์ ๋ ฅ
3 3 7 #.....# #.....# ##...## 3 7 #.....# #.....# ##..### 8 10 ########## #........# #........# #........# #........# #........# #........# ########## |
์์ ์ถ๋ ฅ
0 2 1514 |
๋ฌธ์ ํ์ด
์์ ํ์์ ์ด์ฉํด ํด๊ฒฐํ์. ํฐ ์นธ์ ์๊ฐ 3์ ๋ฐฐ์๊ฐ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ก ์ฒ๋ฆฌ ํด์ผ ๋จ.
์ฃผ์ด์ง ๊ฒ์ํ์ ๋ธ๋ก์ ํ ๊ฐ ๋ด๋ ค๋๊ณ ๋จ์ ํฐ ์นธ๋ค์ ์ฌ๊ท ํธ์ถ์ ์ด์ฉํด ๋ฎ์ผ๋ฉด ๋๋ค.
-
ํ ์นธ์ ๋ฎ๋ 4๊ฐ์ง ๋ฐฉ๋ฒ - coverType
-
๋ณด๋ํ - board
/* L ๋ธ๋ก์ ์ด์ฉํด์ ๊ฒ์ํ์ ๋ฎ๋ ๋ฐฉ๋ฒ์ ์ */
/* 2019-07-08 ๊ฒ์ํ ๋ฎ๊ธฐ */
#include <iostream>
#include <vector>
using namespace std;
const int coverType[4][3][2] = {
{ { 0,0 },{ 1,0 },{ 0,1 } },
{ { 0,0 },{ 0,1 },{ 1,1 } },
{ { 0,0 },{ 1,0 },{ 1,1 } },
{ { 0,0 },{ 1,0 },{ 1,-1 } }
};
//์ด ์นธ์ ๋ฎ์ ์ ์๋์ง ํ๋จํ๊ณ boardํ์ ๋ฎ๊ฑฐ๋ ๋ฎ์๋ ๋ธ๋ก์ ์์ค๋ค
bool set(vector<vector<int> >&board, int y, int x, int type, int delta) {
bool check = true;
for (int i = 0; i < 3; i++) {
int ny = y + coverType[type][i][0];
int nx = x + coverType[type][i][1];
//๋ณด๋ํ ๋ฒ์๋ฅผ ๋์ด๊ฐ๋์ง
if (ny < 0 || ny >= board.size() || nx < 0 || nx >= board[0].size()) {
check = false;
}
else if ((board[ny][nx] += delta) > 1) check = false; // ๋ฎ์ธ ์นธ์ ๋ ๋ฎ๋ ๊ฒฝ์ฐ false
}
return check;
}
int cover(vector<vector<int> >&board) {
int y = -1, x = -1;
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[i].size(); j++) {
if (board[i][j] == 0) { // ๊ฐ์ฅ ๋จผ์ ๋ฎ์ ์นธ ์ฐพ๊ธฐ
y = i;
x = j;
break;
}
}
if (y != -1) break; // for๋ฌธ ํ๋ฒ๋ ๋ฉ์ถ๊ธฐ
}
if (y == -1) return 1;
int ret = 0;
for (int i = 0; i < 4; i++) {
if (set(board, y, x, i, 1)) ret += cover(board);
set(board, y, x, i, -1);
}
return ret;
}
int main() {
int c, h, w;
cin >> c; //test case
for (int i = 0; i < c; i++) {
char temp;
int white = 0;
cin >> h >> w;
vector<vector<int> > board(h, vector<int>(w, 0));
//๋ณด๋ํ ๊ทธ๋ฆฌ๊ธฐ
for (int k = 0; k < h; k++) {
for (int j = 0; j < w; j++) {
cin >> temp;
if (temp == '#') board[k][j] = 1; // ๋ฎํ์ง ์์ ์นธ์ 1๋ก ์ ์ฅ
else white++;
}
}
if (white % 3 != 0) cout << 0;
else cout << cover(board)<<endl;
}
}
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ ์ ๋ต 1์ ์ฝ๋๋ฅผ ์ด์ฉํด์ ํ์๋ค. ์ด์ ํ์๋ ์ํ๊ณผ ๋น์ทํ ๋ฌธ์ ๋ผ๋ ์๊ฐ์ด ๋ค์์ง๋ง ๋ณด๋ํ ๋ด์์ ์๋ ์์น๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์ต์์ง ์์ ์ฑ ์ ๋์์ ๋น๋ ธ๋ค.
๋จผ์ ํฐ ์นธ์ ์๊ฐ 3์ ๋ฐฐ์๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด ๋ต์ด ์์ผ๋ ๊ทธ ๋ถ๋ถ์ ๋ฐ๋ก ์ฒ๋ฆฌํ๋ค. ์ด ์ธ์ ๊ฒฝ์ฐ์๋ ํฐ ์นธ์ ์๋ฅผ 3์ผ๋ก ๋๋ ์ ๋ด๋ ค๋์ ๋ธ๋ก์ ์ n์ ์ป์ ๋ค, ๋ฌธ์ ์ ๋ต์ ์์ฑํ๋ ๊ณผ์ ์ n์กฐ๊ฐ์ผ๋ก ๋๋ ํ ์กฐ๊ฐ์์ ํ ๋ธ๋ก์ ๋ด๋ ค๋๊ฒ ํ๋ฉด ๋๋ค. ์ฆ ์ฌ๊ท ํจ์๋ ์ฃผ์ด์ง ๊ฒ์ํ์ ๋ธ๋ก์ ํ ๊ฐ ๋ด๋ ค๋๊ณ ๋จ์ ํฐ ์นธ ๋ค์ ์ฌ๊ท ํธ์ถ์ ์ด์ฉํด ๋ฎ๋๋ก ํ๋ฉด ๋๋ค.
coverType[4][3][2] ๋ ๋ธ๋ก์ ๊ตฌ์ฑํ๋ ์ธ ์นธ์ ์๋์ ์์น์ ๋ชฉ๋ก์ด๋ค.
{ { 0,0 },{ 1,0 },{ 0,1 } }, // Γ { { 0,0 },{ 0,1 },{ 1,1 } }, // ใฑ { { 0,0 },{ 1,0 },{ 1,1 } }, // ใด { { 0,0 },{ 1,0 },{ 1,-1 } } // โ |
[4]๋ ๊ฐ 4๊ฐ์ ํ์ , [3]์ ๊ฐ ํ์ ์ ๊ตฌ์ฑํ๋ ์นธ์ ์์น, [2]๋ ํ ์นธ์ ์๋ ์ขํ๋ฅผ ์๋ฏธํ๋ค.
set ํจ์๋ ์ด ์นธ์ ๋ธ๋ก์ ๋์ ์ ์๋์ง ํ๋จํ๊ณ , ๋์ ์ ์๋ค๋ฉด ๋ธ๋ก์ ๋๋ ์ญํ ๋ ํ๋ค. ๊ทธ๋ฟ ์๋๋ผ ๋ธ๋ก์ ์ ๊ฑฐํ๋ ์ญํ ๋ ์ํํ ์ ์๋ค.
bool set(vector<vector >&board, int y, int x, int type, int delta) |
board - ๋ณด๋ํ, y,x - ๋ด๋ ค๋์ ์์น, type - 4๊ฐ์ง ํ์ ์ค์์ ์ด๋ป๊ฒ ๋ด๋ ค๋์ ๊ฑด์ง, delta - ๋ด๋ ค๋์ ๊ฑด์ง, ์ ๊ฑฐํ ๊ฑด์ง
set ํจ์์์ type์ด ์ ํด์ ธ์ ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ ๊ทธ type์ ๋ง๋ ์๋ ์์น์ 3๊ฐ์ง ๋ธ๋ก์ ๋ฃ์ ์ ์๋์ง ์๋์ง ํ๋จํ๊ณ ๋ฃ์ผ๋ฉด ๋๋ค.
์ด๋ ์ฒซ๋ฒ์งธ if๋ฌธ์ด ์ถฉ์กฑ๋๋ค๋ฉด else if๋ฌธ์ ๊ฑด๋ค์ง ์๊ธฐ ๋๋ฌธ์ board [ny][nx]์ ๊ฐ์ด ๋ฐ๋์ง ์๋๋ค.
ํ์ง๋ง ๋ณด๋ํ ๋ฒ์๋ฅผ ๋์ด๊ฐ์ง ์๋๋ค๋ฉด delta์ ๋ฐ๋ผ ํ๋ํด์ผ ํ๋ค. else if๋ฌธ์์๋ board [ny][nx] += delta๋ฅผ ๋จผ์ ์ํํ๋๋ฐ, ์ด๋ ๋์ฌ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ ๋ค์๊ณผ ๊ฐ๋ค
- delta==1 (๋ธ๋ก์ ๋๋ ๊ฒฝ์ฐ) : 1 + 0(board) -> 1 / 1 + 1(board) -> 2
- dalta==-1 (๋ธ๋ก์ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ) : -1 + 0(board) -> -1 / -1 + 1(board) -> 0
else if ๋ฌธ์ ๋ง์กฑํด์ check๊ฐ false๊ฐ ๋๋ ๊ฒฝ์ฐ๋ ๋ธ๋ก์ด ์๋ ๊ณณ์ ๋ ๋๋ ๊ฒฝ์ฐ์ธ '2' ๋ฐ์ ์๋ค.
์ด ๊ฒฝ์ฐ์ board[ny][nx]์board [ny][nx]์ ๊ฐ์ด 2๊ฐ ๋๊ณ check๋ false๋ก return ๋๋๋ฐ cover ํจ์์์ if๋ฌธ์ ๋ง์กฑ์ํค์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก set(board, y, x, type, -1)์ด ์ํ๋์ด ๋ค์ ์ด์ ์ board [ny][nx]์ ๊ฐ์ด 1์ด ๋จ์ผ๋ก ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋ค.
cover ํจ์์์๋ ๊ฐ์ฅ ๋จผ์ ๋ฎ์ ์นธ์ ์ฐพ๋๋ค. ์ด๋ ์ค๋ณต ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ฅ ์์ ์๊ณ ์ผ์ชฝ์ ์๋ ์นธ์ ์ฐ์ ์ ์ผ๋ก ์ฐพ๋๋ค. ์ด๋ ๋ฎ์ ์นธ์ด ์๋ค๋ฉด ๋ชจ๋ ์นธ์ ๋ฎ์ ๊ฒฝ์ฐ์ ์ ํ๋๋ฅผ ์ฐพ์๋ค๋ ๋ป์์ผ๋ก return 1์ ํด์ค๋ค.
๊ทธ ๋ค 4๋ฒ ๋๋ for๋ฌธ์ ์ด์ฉํด์ 4๊ฐ์ง type ๋ชจ๋๋ฅผ testํ๋ค. ์ด๋ set ํจ์๋ฅผ ์ด์ฉํด์ ๋ธ๋ก์ ๋์ ์ ์๋์ง ์๋์ง ํ๋จํ๊ณ ๋ธ๋ก์ ๋ฐฐ์นํ๋ค. ๋ฐฐ์น ํ ๋ค์์๋ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฐพ๊ธฐ ์ํด์ ๋ธ๋ก ๋ฐฐ์น๋ฅผ ์ทจ์ํ๋ค.
์ ์ฒด์ ์ผ๋ก ๋ค ํ๊ณ ๋๋ ์ํ๊ณผ ๋น์ทํ ํํ์ ๋ฌธ์ ์๋ค. ํ์ง๋ง ์์ง ์ฌ๊ท ํธ์ถ๊ณผ ์์ ํ์์ ๊ตฌํ ํ๋๋ฐ ์ด๋ ค์์ ๊ฒช์ด ํ๋ค์๋ค. ๋ํ ๋ ธํธ๋ถ์ด ์ข์ง ์์ ์์ ํ์์ผ๋ก ๊ตฌํํ๋ฉด ์ค๋ ๊ธฐ๋ค๋ ค์ผ ํด์ ๊ธฐ๋ค๋ฆผ์ด ๊ท์ฐฎ์๋น..