문제 https://www.acmicpc.net/problem/2178
풀이
최단 거리를 구해야 하므로 BFS를 이용한다. BFS는 시작 노드에서 가까운 노드를 먼저 방문하기 때문에 BFS로 탐색하다가 먼저 찾아지는 답이 최단거리가 되기 때문이다.
코드
#include <iostream>
#include <queue>
using namespace std;
int n,m;
bool visited[100][100]; //방문여부
int map[100][100]; //미로
int cnt[100][100]; //경로 세기
int dx[4] = {1, 0, -1, 0}; //방향 설정
int dy[4] = {0, 1, 0, -1};
void bfs(int x, int y)
{
visited[x][y]=true;
queue<pair<int,int>> q;
q.push(make_pair(x,y));
while(!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int i=0; i<4; i++)
{
int rx = x+dx[i];
int ry = y+dy[i];
if(rx>=n || rx<0 || ry>=m || ry<0) continue;
if(!visited[rx][ry]&&map[rx][ry]==1)
{
cnt[rx][ry]=cnt[x][y]+1;
visited[rx][ry]=true;
q.push(make_pair(rx,ry));
}
}
}
}
int main()
{
cin>>n>>m;
char s[100];
for(int i=0; i<n; i++)
{
scanf("%s",s);
for(int j=0; j<m; j++)
{
int a = s[j]-'0';
map[i][j]=a;
}
}
bfs(0,0);
cout<<cnt[n-1][m-1]+1;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
백준 8979 - 올림픽(C++) (0) | 2022.06.23 |
---|---|
백준 1244 - 스위치 켜고 끄기(C++) (0) | 2022.06.21 |
백준 4963 - 섬의 개수(C++) (0) | 2022.06.19 |
프로그래머스 - 전화번호 목록(c++) (0) | 2022.06.17 |
백준 1269 - 대칭 차집합 (0) | 2022.06.07 |