공부/SWEA

SWEA 1249. [S/W 문제해결 응용] 4일차 - 보급로 (C++)

밤톨ㅇl 2024. 5. 15. 18:29
#include <stdio.h>
#include <queue>

using namespace std;

int N;
int map[101][101];
int dist[101][101];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int visited[101][101];
queue<pair<int, int>> q;

void initialize()
{
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < N; j++)
		{
			dist[i][j] = 0;
			visited[i][j] = 0;
		}
	}
}

void solve(int x, int y)
{
	q.push(make_pair(x, y));
	visited[x][y] = 1;

	while (!q.empty())
	{
		int cntx = q.front().first;
		int cnty = q.front().second;

		q.pop();

		for (int i = 0; i < 4; i++)
		{
			int nx = dx[i] + cntx;
			int ny = dy[i] + cnty;

			if (nx < 0 || ny < 0 || nx >= N || ny >= N)
				continue;
			if (!visited[nx][ny] || dist[nx][ny] > dist[cntx][cnty] + map[nx][ny])
			{
				q.push({ nx, ny });
				dist[nx][ny] = dist[cntx][cnty] + map[nx][ny];
				visited[nx][ny] = 1;
			}
		}
	}
}
int main()
{
	int tc;
	scanf("%d", &tc);
	for (int t = 1; t <= tc; t++)
	{
		scanf("%d", &N);
		initialize();
		for (int i = 0; i < N; i++)
		{
			for (int j = 0; j < N; j++)
			{
				scanf("%1d", &map[i][j]);
			}
		}
		solve(0, 0);
		printf("#%d %d\n", t, dist[N - 1][N - 1]);
	}
	return 0;
}

1. bfs 사용

좀 어렵게 푼거 같아서 다시 풀어봐야겠땅