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

+ Recent posts