1189 컴백홈.

phoenixKim·2022년 9월 19일
0

백준 알고리즘

목록 보기
130/174

문제가 난해하지만, 일단 푸는 것에 초점을...

내가 난독증인가... ㅜ ㅜ
1) 상하좌우로 움직인다는 말이 없음. 대각선으로도 움직일 수 있는디??!!
2) 이동거리에 대해서도 의문임. 시작할 때는 0부터 시작해야 하는게
맞는데 .. 문제를 읽어보면 이상함. 저기가 왜 6이 나오는지??

  • 아래 그림을 보고 뭔소리야 했는데

  • 빨간색 부분에서 거리가 어떻게 6이 나올수 있는거지???
    a는 왼쪽 아래 점??? 이 아닌데??? ㅋㅋ
    왼쪽 아래 점이 도대체 어느 부분을 가리키는지 알 수 없지만..
    왼쪽 아래를 1로 두고 진행하면, 위의 거리 6 6 6 8 8 10 6 에 도달가능한 경로는 도출할 수 있음.


언제품?

  • 220919

도착할 수 있는 모든 경우의 수

-> bfs가 아님, 백트래킹임.

최단 거리 구하는 코드

  • 잘못된 코드
    : 아무생각 없이 bfs로 함..
#include <iostream>
#include <vector>
using namespace std;
#include <algorithm>
#include <queue>
#include <string>

//  1189 컴백홈
// 15:36 ~ 

// 상하좌우
int dy[]{ -1,1,0,0 };
int dx[]{ 0,0,-1,1 };

int r, c, k;


void bfs(vector<vector<char>>&v ,int y , int x
		,vector<vector<int>>&visited)
{
	int destY = 0;
	int destX = c - 1;

	if (v[y][x] == 'T')
	{
		return;
	}

	queue<pair<int, int>>q;
	q.push(make_pair(y, x));
	visited[y][x] = 0;

	while (!q.empty())
	{
		int curY = q.front().first;
		int curX = q.front().second;
		q.pop();
		if (curY == destY && curX == destX)
			continue;

		for (int i = 0; i < 4; ++i)
		{
			int nextY = curY + dy[i];
			int nextX = curX + dx[i];

			if (nextY < 0 || nextY >= r
				|| nextX < 0 || nextX >= c)
			{
				continue;
			}
			if (visited[nextY][nextX] != -1 )
				continue;
			if (v[nextY][nextX] == 'T')
				continue;

			visited[nextY][nextX] = visited[curY][curX] + 1;

			q.push(make_pair(nextY, nextX));
		}
	}


}


int main()
{
	// bfs 처리를 하면서 
	// 오른쪽 위까지 진행하면서 거리가 k일 때 카운팅을 하자. 

	// 이동할 수 있는 부분은 '.'으로 되어 있는 원소

	cin >> r >> c >> k;

	vector<vector<char>>v(r, vector<char>(c));

	for (int i = 0; i < r; ++i)
	{
		string s;
		cin >> s;
		for (int j = 0; j < c; ++j)
		{
			v[i][j] = s[j];
		}
	}

	vector<vector<int>>visited(r, vector<int>(c, -1));
	
	// 시작점은 왼쪽 위부분임. 
	bfs(v, r - 1, 0, visited);
	for (int i = 0; i < r; ++i)
	{
		for (int j = 0; j < c; ++j)
		{
			cout << visited[i][j] << " ";
		}
		cout << endl;
	}


}
profile
🔥🔥🔥

0개의 댓글

관련 채용 정보