#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
queue<int> answer;
int row, col;
int matrix[20][20];
int run() {
/* ์ผ์ชฝ ์ ๋ถํฐ ํ์ํ์ฌ ๋น์ด์๋ ์นธ์ x,y์ ์ ์ฅ
* flag ์ง์ ํ์ฌ, ์ฐพ๋ ์ฆ์ ๋ฐ๋ณต๋ฌธ ํ์ถ
* x, y๊ฐ ๋ฐ๋ณต๋ฌธ์ ๊ทธ๋๋ก ํต๊ณผํ๋ฉด ๋ชจ๋ ์ฑ์์ก๋ค๋ ์๋ฏธ >> 1์ ๋ฐํ(result์ ๋ํด์ง)
*/
int x = -1;
int y = -1;
bool flag = false;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++)
if (matrix[i][j] == 0) {
x = i;
y = j;
flag = true;
break;
}
if (flag == true)
break;
}
if (x == -1) return 1;
/* ๋ชจ์์ ๋ง๊ฒ x, y์ ๋ฒ์ ๋น์ด์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌ
* ํธ์ถ๋ ์ผ์ด์ค ๋ณ๋ก ๊ฐ๊ฐ์ ์ฑ๊ณต ํ์๊ฐ result์ ๋ํด์ง
* ์คํจ ์ ๋์์ ๋ถํฐ ๋ฐํ๋๋ฉฐ ์ฌ๊ทํธ์ถ๋ฌธ ๋ค์ ๋ฌธ์ฅ๋ค๋ก ์์๋ณต๊ท
*/
bool flag2 = false;
int result = 0;
// โ๋ชจ์, โ ๋ชจ์, โ ๋ชจ์, โ๋ชจ์ ์์๋ก ๊ฒ์ฌํ๊ณ ๊ฐ ๊ฒฝ์ฐ ์ฌ๊ท ํธ์ถํ์ฌ ํ์
if ((y > 0 && x < row - 1) && (matrix[x + 1][y] == 0 && matrix[x + 1][y - 1] == 0)) {
matrix[x][y] = 1;
matrix[x + 1][y] = 1;
matrix[x + 1][y - 1] = 1;
result += run();
matrix[x][y] = 0;
matrix[x + 1][y] = 0;
matrix[x + 1][y - 1] = 0;
flag2 = true;
}
if ((y < col - 1 && x < row - 1) && (matrix[x + 1][y] == 0 && matrix[x + 1][y + 1] == 0)) {
matrix[x][y] = 1;
matrix[x + 1][y] = 1;
matrix[x + 1][y + 1] = 1;
result += run();
matrix[x][y] = 0;
matrix[x + 1][y] = 0;
matrix[x + 1][y + 1] = 0;
flag2 = true;
}
if ((y < col - 1 && x < row - 1) && (matrix[x + 1][y] == 0 && matrix[x][y + 1] == 0)) {
matrix[x][y] = 1;
matrix[x][y + 1] = 1;
matrix[x + 1][y] = 1;
result += run();
matrix[x][y] = 0;
matrix[x][y + 1] = 0;
matrix[x + 1][y] = 0;
flag2 = true;
}
if ((y < col - 1 && x < row - 1) && (matrix[x][y + 1] == 0 && matrix[x + 1][y + 1] == 0)) {
matrix[x][y] = 1;
matrix[x][y + 1] = 1;
matrix[x + 1][y + 1] = 1;
result += run();
matrix[x][y] = 0;
matrix[x][y + 1] = 0;
matrix[x + 1][y + 1] = 0;
flag2 = true;
}
if (!flag2) return 0;
return result;
}
int main() {
int tc;
char input;
int count;
cin >> tc;
while (tc > 0) {
cin >> row >> col;
memset(matrix, -1, sizeof(matrix));
count = 0;
// matrix์๋ ํธ์์ '#'์ -1, '.'์ 0์ผ๋ก ๋ฐ๊ฟ ์ ์ฅ
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cin >> input;
if (input == '#') matrix[i][j] = -1;
else if (input == '.') {
matrix[i][j] = 0;
count++;
}
else return -1;
}
}
// ์ ์ด์ ๋น์นธ์ด 3์ ๋ฐฐ์๊ฐ ์๋๋ฉด ์ ๋ต์ 0
if (count % 3 == 0) answer.push(run());
else answer.push(0);
tc--;
}
while (!answer.empty()) {
cout << answer.front() << endl;
answer.pop();
}
return 0;
}
๋จผ์ ์ด๋ป๊ฒ ํ๋ฉด ๋ณด๋๊ฒ์ํ์ ๋ฎ์ ์ ์์ ์ง ๊ฒฝ์ฐ์ ์๋ฅผ ์ง์ ์ธ์ด๋ณด๊ธฐ๋ก ํ๋ค. ์ค๋ณต๋์ง ์๊ฒ ์ธ์ด์ผ ํ๋ฏ๋ก, ๊ณ ๋ฑํ๊ต ๋ ๊ฒฝ์ฐ์ ์ ๋ฌธ์ ๋ฅผ ํ ๋์ '์ฌ์ ์ ๋ฐฐ์ด'๊ณผ ๊ฐ์ด ๊ธฐ์ค์ด ์์ด์ผ ํ๋ค.
๋๋ โ๋ชจ์ →โ ๋ชจ์ →โ ๋ชจ์ → โ๋ชจ์์ ์ฐ์ ์์๋ก ๋์๊ณ , ์ 4๊ฐ์ง ํจํด์ ๊ทธ๋ฆฌ๋๋ฐ ์คํจ ํ๋ค๋ฉด ์ด์ ๋จ๊ณ๋ก ๋์์ ์ฐ์ ์์๋ฅผ ๋ณด๊ณ ๋ค๋ฅธ ์ ํ์ง๋ฅผ ๊ณจ๋ผ์ผํจ์ ์๊ฒ๋์๋ค.
โ์ด๋ฌํ ์์์ ํ๋ฆ์ ๋ฐ๋ผ ์ฌ๊ทํ์ฌ ์์ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค. ์กฐ๊ฐ์ ๋ชจ์์ 3์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅํ์ฌ ํ์ดํ๋ค๋ฉด ์ฝ๋๊ฐ ๋ ์งง์์ก์ ์๋ ์์๊ฒ ๋ค ์๊ฐํ๋ค.
'๐ > ์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์นด๋ผ์ถ๋ฐ์ ๋น ๋ฅธ ๊ณฑ์ (Karatsuba) (1) | 2020.07.28 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ถํ ์ ๋ณต(Divide & Conquer) (0) | 2020.07.28 |
[์๊ณ ๋ฆฌ์ฆ] ์์ ํ์(CLOCKSYNC) (0) | 2020.07.28 |
[์๊ณ ๋ฆฌ์ฆ] ์์ ํ์(PICNIC) (0) | 2020.07.28 |
[์๊ณ ๋ฆฌ์ฆ] ๋ฌด์ํ๊ฒ ํ๊ธฐ(Brute-Force) (0) | 2020.07.28 |