๋ฌธ์
์ก๊ฐํ ์ฐ๋ฆฌ ์์ ๊ฐ๋ฏธ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
๊ฐ๋ฏธ๊ฐ ์ด์ ์ ๋ฐฉ๋ฌธํ๋, ์ฆ, ํ๋ก๋ชฌ์ด ๋ฟ๋ ค์ง ์ง์ ์ ๋์ฐฉํ๋ฉด ์ด๊ณณ์ด ์ด๋ฏธ ์ต์ํ ์์ญ์ด๋ผ๋ ์ฐฉ๊ฐ์ ๋น ์ง๊ณ ๋ ์ด์์ ํ์์ ๋ฉ์ถ๋ค. ์ด๋ ๊ฒ ํ์์ ๋ฉ์ท์ ๋, ๋ฐฉํฅ์ ํ์ ํ ํ์๊ฐ ์ ํํ N๋ฒ์ด ๋๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํด๋ณด์.
ํ์ด
๊ฐ๋ฏธ๊ฐ ์์นํ ์ก๊ฐํ์ ์ ์ ๋ฐ๋ผ TYPE1, TYPE2๊ฐ ๋์ฌ ์ ์๋ค.
์ก๊ฐํ์ ์ด๋ ๊ฒ 3์ฐจ์์ ์ ์ฌ๋ฉด์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ค์์ ๊ฐ๊ฐ x์ถ์ผ๋ก +1, y์ถ์ผ๋ก +1, z์ถ์ผ๋ก +1์ด๋ค.
์ด๋ฌํ ๋ฐฉ์์ ํ ๋๋ก ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ์๋ค.
- (0, 0, 0)์ ์ด๋ฏธ ๋ค๋ฅด๊ณ , z์ถ ์ด๋ํ ๊ฒ(0, 0, 1)์ผ๋ก ์ฒ์ ์ด๋์ ๊ณ ์ ํ๋ค.
- ๋ค์ ์ด๋๋ถํฐ๋ TYPE์ ๋ฐ๋ผ 3๊ฐ์ง ๋ฐฉํฅ์ผ๋ก ์ด๋ํ ์ ์๋ค.
- ๋ง์ผ ํ์ฌ TYPE 1์ x์ถ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ค๋ฉด,
- ๋ค์ ํด์ TYPE 2์ ๋ฐฉํฅ๋ค๋ก ์ด๋ํ ์ ์๊ณ
- TYPE 2์ ๋ฐฉํฅ ์ค x์ถ ๋ฐฉํฅ(๋ฐฉ๊ธ ๊ฑด๋์จ ๋ฐฉํฅ)์ผ๋ก๋ ๋์๊ฐ์ง ์๋๋ค.
- ๋ฐ๋ผ์ ๊ฐ TYPE์ ๋ฐฉํฅ์ด 3๊ฐ์ง์ด๋ฏ๋ก, ๊ฐ ํด์ ๊ฐ๋ฅํ ๊ฐ๋ฏธ์ ์งํ๋ฐฉํฅ์ 2๊ฐ์ง์ด๋ค.
- ์ด๋ ์ค์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ๋ค์ ๋ฐฉ๋ฌธํ๋ค๋ฉด
- ํ์ฌ ๋ฐฉํฅ ์ ํ ํ์๊ฐ ๋ชฉํํ ๋ฐฉํฅ ์ ํ ํ์์ธ์ง ํ์ธํ๊ณ
- ๋ง๋ค๋ฉด ์ ๋ต์ ๊ฐ์๋ฅผ +1ํ๋ค.
- ์๋๋ผ๋ฉด ํ์์ ๋ง์น๋ค.
- ํ์ฌ ๋ฐฉํฅ ์ ํ ํ์๊ฐ ๋ชฉํํ ๋ฐฉํฅ ์ ํ ํ์์ธ์ง ํ์ธํ๊ณ
- ์ด๋ ์ค ๋ชฉํํ ๋ฐฉํฅ ์ ํ ํ์๋ฅผ ์ด๊ณผํ๋ฉด ํ์์ ๋ง์น๋ค.
์ฝ๋
#include <iostream>
using namespace std;
int directionTypeOne[3][3] = { {-1, 0, 0}, {0, -1, 0}, {0, 0, -1} };
int directionTypeTwo[3][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };
int N;
int result = 0;
int visited[46][46][46]; // ์์๊น์ง ํํ
bool isInitialPos(int x, int y, int z) {
return (x == 0) && (y == 0) && (z == 0);
}
void dfs(int x, int y, int z, bool type, int xyzWhich, int cnt) {
if (visited[x + 22][y + 22][z + 22] == 1) { // ์ด์ ์ ๋ฐฉ๋ฌธ ํ ๊ณณ
if (cnt == N)
result++;
return; // ํ์ ๋
}
if (cnt > N) {
return;
}
visited[x + 22][y + 22][z + 22] = 1;
auto directionArr = (type ? directionTypeOne : directionTypeTwo);
for (int i = 0; i < 3; i++) {
if (i == xyzWhich) continue; // ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋๋์๊ฐ์ง ์์
int xNew = x + directionArr[i][0];
int yNew = y + directionArr[i][1];
int zNew = z + directionArr[i][2];
dfs(xNew, yNew, zNew, !type, i, cnt+1);
}
visited[x + 22][y + 22][z + 22] = 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
// N๋ฒ๋ง์ ๊ฐ๋ฏธ๋ ์ ์๋ฆฌ๋ก ๋์์์ผ ํจ
// ๋ฐฉํฅ์ ๋ฐ๋ผ์ ๊ฐ์ ๊ฒฝ๋ก๋ ๋ค๋ฅผ ์ ์์ => ์ ์ ๋ฐฉ๋ฌธํ๋ ์์
// ๋ฐฉํฅ์ ์ฒ์์ 3๊ฐ์ง, ๋ค์๋ถํฐ๋ ๋ณธ์ธ์ด ์จ ๊ฒฝ๋ก๋ฅผ ์ ์ธํ 2๊ฐ์ง (x, y, z๋ก ์๊ฐ)
cin >> N;
fill(&visited[0][0][0], &visited[45][45][46], 0);
visited[22][22][22] = 1; // ์์์ => ์ฃผ์!
dfs(0, 0, 1, true, 2, 0);// ์ฒซ๋ฒ์งธ ๊ฒฝ๋ก๋ ๊ณ ์
cout << result;
}
๊ฒฐ๊ณผ
์์ด๋ | ๋ฉ๋ชจ๋ฆฌ | ์๊ฐ | ์ฝ๋ ๊ธธ์ด |
---|---|---|---|
gmldms784 | 2400 | 44 | 1461 |
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 3108 :: ๋ก๊ณ (0) | 2021.08.31 |
---|---|
[c++] BOJ 1027 :: ๊ณ ์ธต ๊ฑด๋ฌผ (0) | 2021.08.31 |
[c++] BOJ 1941 :: ์๋ฌธ๋ ์น ๊ณต์ฃผ (0) | 2021.08.24 |
[c++] BOJ 18119 :: ๋จ์ด ์๊ธฐ (0) | 2021.08.10 |
[c++] BOJ 1062 :: ๊ฐ๋ฅด์นจ (0) | 2021.08.10 |
Comment