https://www.acmicpc.net/problem/17070
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAX = 20;
int answer = 0;
int n;
int map[MAX][MAX];
vector<pair<int, int>> pipe;
//int shape = 0; //0:가로, 1:세로, 2:대각선
struct MOVE { int x, y; };
MOVE mv[3] = { {0,1}, {1,1}, {1,0} };
void MovePipe(vector<pair<int, int>> p, int s) {
if (p[0] == make_pair(n - 1, n - 1)) {
answer += 1;
return;
}
else if (p[1] == make_pair(n - 1, n - 1)) {
answer += 1;
return;
}
if (s == 0) {//가로
int movei = p[1].first;
int movej = p[1].second + 1;
if (movei >= 0 && movei < n && movej >= 0 && movej < n) {
if (map[movei][movej] == 0) {
vector<pair<int, int>> tmp(2);
tmp[0] = p[1];
tmp[1] = { movei,movej };
MovePipe(tmp, 0);
}
}
int count = 0;
for (int k = 0; k < 3; k++) {
movei = p[1].first + mv[k].x;
movej = p[1].second + mv[k].y;
if (movei >= 0 && movei < n && movej >= 0 && movej < n) {
if (map[movei][movej] == 0) {
count++;
}
}
}
if (count == 3) {
vector<pair<int, int>> tmp(2);
tmp[0] = p[1];
tmp[1] = { p[1].first +1,p[1].second +1 };
MovePipe(tmp, 2);
}
}
else if (s == 1) {//세로
int movei = p[1].first + 1;
int movej = p[1].second;
if (movei >= 0 && movei < n && movej >= 0 && movej < n) {
if (map[movei][movej] == 0) {
vector<pair<int, int>> tmp(2);
tmp[0] = p[1];
tmp[1] = { movei,movej };
MovePipe(tmp, 1);
}
}
int count = 0;
for (int k = 0; k < 3; k++) {
movei = p[1].first + mv[k].x;
movej = p[1].second + mv[k].y;
if (movei >= 0 && movei < n && movej >= 0 && movej < n) {
if (map[movei][movej] == 0) {
count++;
}
}
}
if (count == 3) {
vector<pair<int, int>> tmp(2);
tmp[0] = p[1];
tmp[1] = { p[1].first + 1,p[1].second + 1 };
MovePipe(tmp, 2);
}
}
else if (s == 2) {//대각선
int movei = p[1].first;
int movej = p[1].second + 1;
if (movei >= 0 && movei < n && movej >= 0 && movej < n) {
if (map[movei][movej] == 0) {
vector<pair<int, int>> tmp(2);
tmp[0] = p[1];
tmp[1] = { movei,movej };
MovePipe(tmp, 0);
}
}
movei = p[1].first + 1;
movej = p[1].second;
if (movei >= 0 && movei < n && movej >= 0 && movej < n) {
if (map[movei][movej] == 0) {
vector<pair<int, int>> tmp(2);
tmp[0] = p[1];
tmp[1] = { movei,movej };
MovePipe(tmp, 1);
}
}
int count = 0;
for (int k = 0; k < 3; k++) {
movei = p[1].first + mv[k].x;
movej = p[1].second + mv[k].y;
if (movei >= 0 && movei < n && movej >= 0 && movej < n) {
if (map[movei][movej] == 0) {
count++;
}
}
}
if (count == 3) {
vector<pair<int, int>> tmp(2);
tmp[0] = p[1];
tmp[1] = { p[1].first + 1,p[1].second + 1 };
MovePipe(tmp, 2);
}
}
}
int main(void) {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
}
}
pipe.push_back({ 0, 0 });
pipe.push_back({ 0, 1 });
MovePipe(pipe, 0);
cout << answer << endl;
}
'백준 알고리즘 > 구현' 카테고리의 다른 글
청소년 상어 C++ (0) | 2021.10.14 |
---|---|
파이프 옮기기 C++ (0) | 2021.10.14 |
어른 상어 C++ (0) | 2021.10.13 |
컨베이어 벨트 위의 로봇 (0) | 2021.10.12 |
마법사 상어와 파이어볼 C++ (0) | 2021.09.30 |