1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include<cstdio> #include<queue> #include<algorithm> #include<cstring> using namespace std; int dx[]={0,0,1,-1}, dy[]={1,-1,0,0}; struct data{int y,x,cur;}; queue<struct data> q; int arr[102][102]; int visited[102][102]; int n,m,x,y,cur,wall; void bfs(void){ memset(visited,-1,sizeof(visited)); visited[1][1]=0; while(!q.empty()){ y=q.front().y; x=q.front().x; cur=q.front().cur; q.pop(); for(int k=0; k<4; k++){ int ny=y+dy[k]; int nx=x+dx[k]; if(1<=nx && nx<=m && 1<=ny && ny<=n){ if(arr[ny][nx]==-1){ if(visited[ny][nx]==-1){ q.push({ny,nx,cur}); visited[ny][nx]=cur; } else { if(visited[ny][nx]>cur){ q.push({ny,nx,cur}); visited[ny][nx]=cur; } } } else if(arr[ny][nx]==1){ if(visited[ny][nx]==-1){ q.push({ny,nx,cur+1}); visited[ny][nx]=cur+1; } else { if(visited[ny][nx]>cur+1){ q.push({ny,nx,cur+1}); visited[ny][nx]=cur+1; } } } } } } } int main(void){ scanf("%d %d", &m, &n); for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ scanf("%1d", &arr[i][j]); if(arr[i][j]==0) arr[i][j]=-1; } } q.push({1,1,0}); bfs(); printf("%d", visited[n][m]); return 0; } | cs |
이 문제와 비슷한 문제가 분명 있었던 것 같은데 어느 문제인지 모르겠다.
27~48 라인 줄일 수 있을 것 같은데 지금은 방법이 생각 안 남ㅠㅠ
'백준 2 > 그래프' 카테고리의 다른 글
| [백준 9753] 짝 곱 (C++/Java) (0) | 2020.12.10 |
|---|---|
| [백준 4179] 불! (C++/Python) (0) | 2020.12.08 |
| [백준 2206] 벽 부수고 이동하기 (C++/Python) (0) | 2020.12.08 |
| [백준 11404] 플로이드 (C++/Java) (0) | 2020.12.08 |
| [백준 3055] 탈출 (C++) (0) | 2020.12.08 |