문제 https://www.acmicpc.net/problem/2178
2178번: 미로 탐색
첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.
www.acmicpc.net
풀이
최단 거리를 구해야 하므로 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 |