https://www.acmicpc.net/problem/2206
2206번: 벽 부수고 이동하기
N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로
www.acmicpc.net
아 솔직히 입력값 string으로 받는지 int로 받는지 좀 알려줬으면하네요 ....아 진짜 좀 빡치네요..
정답:
#include <iostream>
#include <vector>
#include <queue>
#include<string>
using namespace std;
struct Point {
int n, m;
int cnt = 0;
bool bBreak = false;
};
void Prints(vector<vector<int>>maps, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[i][j];
}
cout << endl;
}
cout << endl;
}
void Prints(vector<vector<bool>>maps, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << maps[i][j];
}
cout << endl;
}
cout << endl;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>>maps;
vector<bool>tmpVistedz(2, false);
vector<vector<bool>>tmpVisted(m, tmpVistedz);
vector<vector<vector<bool>>>bVisited(n, tmpVisted);
int a[4][4] = { {0,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,0} };
for (int i = 0; i < n; i++) {
vector<int>tmpMap;
string temp;
cin >> temp;
for (int j = 0; j < m; j++) {
tmpMap.push_back(temp[j] - '0');
}
maps.push_back(tmpMap);
}
queue<Point> q;
Point p;
p.m = 0;
p.n = 0;
p.cnt = 1;
q.push(p);
int dirm[] = { 0,0,1,-1 };
int dirn[] = { 1,-1,0,0 };
bool bEnd = false;
bool bFirst = false;
bVisited[0][0][0] = true;
maps[0][0] = 0;
while (!q.empty()) {
Point start = q.front();
q.pop();
if (bEnd == true) {
break;
}
for (int i = 0; i < 4; i++) {
int tmpDirn = start.n + dirn[i];
int tmpDirm = start.m + dirm[i];
if (tmpDirm <= -1 || tmpDirn <= -1 || tmpDirm > m - 1 || tmpDirn > n - 1) {
continue;
}
if (start.bBreak==false&&bVisited[tmpDirn][tmpDirm][1] == false&& maps[tmpDirn][tmpDirm] == 1) {
bFirst = true;
bVisited[tmpDirn][tmpDirm][1] = true;
Point tmpPoint;
tmpPoint.m = tmpDirm;
tmpPoint.n = tmpDirn;
tmpPoint.bBreak = true;
tmpPoint.cnt = start.cnt + 1;
q.push(tmpPoint);
if (tmpDirn == n - 1 && tmpDirm == m - 1) {
cout << tmpPoint.cnt;
bEnd = true;
i = 4;
}
}
else if (start.bBreak == true && bVisited[tmpDirn][tmpDirm][1] == false && maps[tmpDirn][tmpDirm] == 0) {
bFirst = true;
bVisited[tmpDirn][tmpDirm][1] = true;
Point tmpPoint;
tmpPoint.m = tmpDirm;
tmpPoint.n = tmpDirn;
tmpPoint.bBreak = start.bBreak;
tmpPoint.cnt = start.cnt + 1;
q.push(tmpPoint);
if (tmpDirn == n - 1 && tmpDirm == m - 1) {
cout << tmpPoint.cnt;
bEnd = true;
i = 4;
}
}
else if (start.bBreak == false && bVisited[tmpDirn][tmpDirm][0] == false && maps[tmpDirn][tmpDirm] == 0) {
bFirst = true;
bVisited[tmpDirn][tmpDirm][0] = true;
Point tmpPoint;
tmpPoint.m = tmpDirm;
tmpPoint.n = tmpDirn;
tmpPoint.bBreak = start.bBreak;
tmpPoint.cnt = start.cnt + 1;
q.push(tmpPoint);
if (tmpDirn == n - 1 && tmpDirm == m - 1) {
cout << tmpPoint.cnt;
bEnd = true;
i = 4;
}
}
}
}
if (bEnd == false && bFirst == true) {
cout << -1;
}
if (bFirst == false) {
cout << 1;
}
return 0;
}
'알고리즘 공부' 카테고리의 다른 글
백준 숨바꼭질 (0) | 2023.07.09 |
---|---|
백준 단지번호붙이기 (0) | 2023.07.07 |
백준 탈출 (0) | 2023.07.05 |
백준 토마토 (0) | 2023.07.04 |
백준- 말이되고픈원숭이 (0) | 2023.06.28 |