백준 2178번 C++


2178 번

백준 2178번 문제

BFS

BFS를 쓰는 이유는 최단 거리를 찾기 위해서이고, 이때 방문한 노드를 기록하는 것과 front, rear를 사용한 큐를 사용하는 방법으로 풀었다.

소스코드

https://gist.github.com/yunsu3042/75f360d660d582f8423f935dd13ebb43


#include <iostream>
#include <string>
using namespace std;
#define SIZE 101
#define MAX 100001

int n = 0;
int m = 0;
char tmp;
int map[SIZE][SIZE] = {1,};
int queue[MAX][2];
int is_visit[SIZE][SIZE] = {0, };

int x = -1;
int y = -1;

int move_x[] = {1, -1, 0, 0};
int move_y[] = {0, 0, 1, -1};
int can_move = 4;

int moved_x = -1;
int moved_y = -1;

int counter[SIZE][SIZE] = {0, };

int front = 0;
int rear = 0;



void print(int v[][SIZE]);
void input();
int check(int a, int b);


int main()
{
    std::ios::sync_with_stdio(false);
    input();
    
//    print(map);
    
    queue[rear][0] = 0;
    queue[rear][0] = 0;
    counter[0][0] = 1;
    is_visit[0][0] = 1;
    rear++;
    
    

    while(front < rear)
    {
        x = queue[front][0];
        y = queue[front][1];
//        is_visit[x][y] = 1;
        if(x == n - 1 && y == m - 1)
            break;
        
        for(int i = 0; i < can_move; i++)
        {
            moved_x = x + move_x[i];
            moved_y = y + move_y[i];
            if(check(moved_x, moved_y) == 1 && map[moved_x][moved_y] == 1 && is_visit[moved_x][moved_y] == 0)
            {
                
                is_visit[moved_x][moved_y] = 1;
                queue[rear][0] = moved_x;
                queue[rear][1] = moved_y;
                counter[moved_x][moved_y] = counter[x][y] + 1;
                if(moved_x == n - 1 && moved_y == m - 1)
                    break;
                rear++;
            }
        }
        front++;
    }
    
//    print(counter);
    
    cout << counter[n-1][m-1] << '\n';

}

int ctoi(char a)
{
    return a - 48;
}

void print(int v[][SIZE])
{
    cout << '\n';
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            cout << v[i][j];
        }
        cout << '\n';
    }
    cout << '\n';
}

void input()
{
    cin >> n >> m;
    
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
        {
            cin >> tmp;
            map[i][j] = ctoi(tmp);
        }
    }
}


int check(int a, int b)
{
    if(a < 0 || a >= n || b < 0 || b >= m)
        return 0;
    return 1;
}





© 2017. by yunsu

Powered by dolphin