본문 바로가기
알고리즘

[알고리즘] cpp 파이프 옮기기

by keel_im 2020. 9. 20.
반응형

포인트

1. 시작 지점을 0,1 로 설정을 해야 하는 부분

2. 대각선, 오른쪽, 아래 방향이 전부 수가 다름

#include <iostream>
#include <queue>
#include <tuple>

using namespace std;

queue<tuple<int, int, int>> q;
int map[17][17];

int n = 0;
int dx[] = {0, 1, 1}; // row, col, cross
int dy[] = {1, 0, 1}; // row, col, cross

int bfs(int a, int b, int c) {
    int count = 0;
    q.push(make_tuple(a, b, c));
    while (!q.empty()) {
        int x, y, dir;
        tie(x, y, dir) = q.front();
        q.pop();

        if (x == n - 1 && y == n - 1) //끝까지 오면
            count++;

        for (int i = 0; i < 3; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            int ndir = i;

            if (ndir + dir == 1) continue; // (row to col) or (col to row) 서로 직각 상황은 나올 수 없다.ㄴ

            if (nx >= n || ny >= n) continue;
            if (map[nx][ny] == 1) continue;

            if (i == 2) { // cross
                if (map[nx - 1][ny] == 1 || map[nx][ny - 1] == 1) continue;

                q.push(make_tuple(nx, ny, ndir));
            } else {
                q.push(make_tuple(nx, ny, ndir));
            }
        }
    }
    return count;
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> map[i][j];

    cout << bfs(0, 1, 0); //출력 //끝자리에서 출력이 편하다'
    //문제의 조건 처음 파이프는 1, 1, 1, 2를 지난다
}
반응형

'알고리즘' 카테고리의 다른 글

[알고리즘] c++ cpp java 주식가격  (0) 2020.09.23
[알고리즘] cpp 멀쩡한 사각형  (0) 2020.09.23
[알고리즘] 아기상어  (0) 2020.09.20
[알고리즘] 스타트와 링크  (0) 2020.09.20
[알고리즘] 시험 감독  (0) 2020.09.20

댓글