ํ๊ณ ๋์ ํ์ด๋ฅผ ์ฐพ์๋ณด๋ ๋ค๋ค ์คํ์ผ๋ก ํ์ด์ ๊ทธ๋ ๊ฒ ๋จธ๋ฆฌ๋ฅผ ์์จ๋ ํ๋ฆฌ๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ๋จ๊ธฐ๋ ค๊ณ TIL์ ๋จ๊น.
์ฌ๊ท์ ์ผ๋ก g = N
์ธ ๊ทธ๋ฆผ์ ๊ทธ๋ฆด ๊ฒฝ์ฐ
g = 1
๋ฐฉํฅ๋ฐ๋ผ ์ ๊ทธ๋ฆผ (๊ธฐ์ ์ผ์ด์ค)g = N-1
์ธ ๊ทธ๋ฆผ์ ์์์ ์์ ์ฐ์ ๊ทธ๋ฆฌ๊ณ
g = N-1
์ธ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฉด๋๋ค. ๋ฌผ๋ก ์ฝ๋๋ฅผ ๋๋ฆฌ๋ ์ปดํจํฐ ์ ์ฅ์์๋ ์คํ์ ์ด์ฉํ ํ์ด๊ฐ ํจ์ฌ ๊น๋ํ๊ฒ ๋ค. ์ค์ ์ฑ์ ์กฐ๊ฑด์์๋ ๋ ๋ค ํต๊ณผํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค.
#include <vector>
#include <utility>
#include <iostream>
using namespace std;
vector<vector<bool> > map;
// (x, y)
vector<vector<int> > dirs = {
{1, 0},
{0, -1},
{-1, 0},
{0, 1}
};
int nextDir, firstDx, firstDy, secondDx, secondDy;
pair<int, int> draw(vector<vector<bool> >& rmap, pair<int, int> start, int dir, int gen) {
// ๋ค ๊ทธ๋ฆฌ๊ณ ์ ๋์ ์ ์์น๋ฅผ ๋ฐํ
if (gen == 0) { // basecase
int x = start.first;
int y = start.second;
int newX = x + dirs[dir][0];
int newY = y + dirs[dir][1];
rmap[newX][newY] = true;
rmap[x][y] = true;
return make_pair(newX, newY);
}
pair<int, int> firstEnd = draw(rmap, start, dir, gen - 1); // ๋จผ์ ์ฒซ๋ฒ์งธ ํํธ๋ฅผ ๊ทธ๋ฆฌ๊ณ
firstDx = firstEnd.first - start.first;
firstDy = firstEnd.second - start.second;
// ์ฒซ๋ฒ์งธ ํํธ์์ ์์ -> ๋์ ๋ณํ๋์ ๊ตฌํ๊ณ
secondDx = -firstDy; // ๊ทธ๊ฑธ ์ค๋ฅธ์ชฝ์ผ๋ก 90๋ ํ์ ํด์
secondDy = firstDx;
nextDir = dir == 0 ? 3 : dir - 1;
//์ฒซ๋ฒ์งธ ๋ถ๋ถ์ด ๋๋ ๊ณณ์์ dx,dy ๋งํผ ๋ค๋ก ๊ฐ์ฃผ๋ฉด ๋๋ฒ์งธ ๋ถ๋ถ์ ์์ํด์ผํ ์์น๊ฐ ๋์ด
pair<int, int> secondStart = make_pair(firstEnd.first - secondDx, firstEnd.second - secondDy);
draw(rmap, secondStart, nextDir, gen - 1);
return secondStart;
}
int main() {
int N;
cin >> N;
map = vector<vector<bool> >(102, vector<bool>(102, false));
int x, y, d, g;
for (int i = 0; i < N; i++) {
cin >> x >> y >> d >> g;
draw(map, make_pair(x, y), d, g);
}
int count = 0;
for (int i = 0; i < 101; i++) {
for (int j = 0; j < 101; j++) {
if (map[i][j] && map[i][j + 1] && map[i + 1][j] && map[i + 1][j + 1]) {
count++;
}
}
}
cout << count << endl;
return 0;
}