보급로

108번뇌·2021년 6월 6일
0
#pragma warning(disable:4996)
#include <iostream>
#include <vector>

#include <queue>
#include "stdio.h"

using namespace std;
int map[100][100] = { 0, };
int chk[100][100] = { 0, };
int bogeup[100][100] = { 0, };//복구시간
int dirX[4] = { 1,-1,0,0 };// 동서남북
int dirY[4] = { 0,0,-1,1 };
int iSize;

void BFS(int a, int b)
{
	queue<pair<int, int>> qContainer;
	chk[a][b] = 1;//방문기록 남기고
	qContainer.push(make_pair(a, b));

	while (!qContainer.empty())
	{
		int x = qContainer.front().first;
		int y = qContainer.front().second;
		qContainer.pop();

		for (int i = 0; i < 4; i++)
		{
			int nx = x + dirX[i];
			int ny = y + dirY[i];

			if (nx >= 0 && ny >= 0 && nx < iSize && ny < iSize)
			{
				if ((chk[nx][ny] == 0) || (bogeup[nx][ny]>bogeup[x][y]+map[nx][ny]))//방문안했거나
				{
					qContainer.push(make_pair(nx, ny));
					chk[nx][ny] = 1;
					bogeup[nx][ny] = bogeup[x][y] + map[nx][ny];//보급로 값 업데이트
				}
			}
		}
	}	
}

void init()
{
	for (int i = 0; i < iSize; i++)
	{
		for (int j = 0; j < iSize; j++)
		{
			map[i][j] = 0;
			chk[i][j] = 0;
			bogeup[i][j] = 0;
		}
	}
}

int main()
{
	int testcase;
	cin >> testcase;

	

	for (int i = 0; i < testcase; i++)
	{

		cin >> iSize;

		for (int j = 0; j < iSize; j++)
		{
			for (int k = 0; k < iSize; k++)
			{
				scanf("%1d", &map[j][k]);
			}
		}

		BFS(0, 0);
		cout << "#" << i + 1 << " " << bogeup[iSize - 1][iSize - 1];//마지막 배열
		init();
	}

}

이문제 풀 때
4
0100
1110
1011
1010
입력이 이런식으로 들어오는데,

1]
cin>> 말고
scanf("%1d",&map[j][k])
이런식으로 받아야 한자씩 받아진다.

2]
if ((chk[nx][ny] == 0) || (bogeup[nx][ny]>bogeup[x][y]+map[nx][ny]))//방문안했거나 보급로 값을 업데이트 할 경우 조건문을 이런식으로 써야함.

profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글