본문 바로가기
백준 알고리즘/구현

파이프 옮기기 1 C++

by paysmile 2021. 10. 13.

https://www.acmicpc.net/problem/17070

 

17070번: 파이프 옮기기 1

유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의

www.acmicpc.net

#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