CS/baekjoon
[백준 17070번] 파이프 옮기기 1
hanjongho
2021. 4. 7. 15:13
http://www.acmicpc.net/problem/17070
17070번: 파이프 옮기기 1
유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의
www.acmicpc.net
풀이)
너무 간단한 문제였다. 방향을 1 - 가로 2 - 대각선 3 - 세로 놓고, 갈 수 있는지 확인을 하고 완전탐색(dfs)를 진행하면 해결되는 문제였다.
#include <iostream>
using namespace std;
int map[17][17];
int N, cnt = 0;
void dfs(int x, int y, int dir)
{
if (x == N && y == N)
{
cnt++;
return;
}
if (dir == 1)
{
if (!map[x][y + 1] && y + 1 <= N)
dfs(x, y + 1, 1);
if (!map[x + 1][y + 1] && !map[x][y + 1] && !map[x + 1][y] && x + 1 <= N && y + 1 <= N)
dfs(x + 1, y + 1, 2);
}
else if (dir == 2)
{
if (!map[x][y + 1] && y + 1 <= N)
dfs(x, y + 1, 1);
if (!map[x + 1][y] && x + 1 <= N)
dfs(x + 1, y, 3);
if (!map[x + 1][y + 1] && !map[x][y + 1] && !map[x + 1][y] && x + 1 <= N && y + 1 <= N)
dfs(x + 1, y + 1, 2);
}
else if (dir == 3)
{
if (!map[x + 1][y] && x + 1 <= N)
dfs(x + 1, y, 3);
if (!map[x + 1][y + 1] && !map[x][y + 1] && !map[x + 1][y] && x + 1 <= N && y + 1 <= N)
dfs(x + 1, y + 1, 2);
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> N;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
cin >> map[i][j];
dfs(1, 2, 1);
cout << cnt;
return (0);
}
제 코드는 절대 완벽하지 않습니다
더 좋은 풀이방법 혹은 코드에 관한 질문이 있으시면 언제든 댓글주세요!