반응형

 

 

토마토마토마토

 

https://www.acmicpc.net/problem/7576

 

 

 

 

 

 

 

 

 

 

익지 않은 토마토는 근처 토마토를 익게 하는 문제 

 

혼자 익는경우가 없을때

모든 토마토가 익을때까지 최소일수 를 구하는 문제

 

간단하게 BFS 를 써서 푸는 문제다 

 

골드 5인만큼 그냥 시뮬레이션 돌리면 풀린다.

 

 

 

 

 

 

#include<iostream>
#include<vector>
#include<queue>
#include <tuple>
using namespace std;

#define XYZ tuple<int,int>

vector<XYZ> nonfire;
const XYZ MoverDirection[4] = { {1,0} ,{-1,0} ,{0,-1} ,{0,1} };
vector<vector<int>> vec;
int N = 0, H = 0;

///토마토 익는칸 확인 함수
vector<XYZ> findNextTomato(vector<XYZ> _xyz) {

	vector<XYZ> firebe = {};
	for (auto a : _xyz) {
		for (auto Dir : MoverDirection) {
			int  xyz2[2] = { get<0>(a) + get<0>(Dir),get<1>(a) + get<1>(Dir) };

			if (!(get<0>(a) + get<0>(Dir) < N && get<0>(a) + get<0>(Dir) >= 0 &&
				get<1>(a) + get<1>(Dir) < H && get<1>(a) + get<1>(Dir) >= 0)) {
				continue;
			}

			if (vec[xyz2[0]][xyz2[1]] == 0) {
				firebe.push_back(XYZ(xyz2[0], xyz2[1]));
				vec[xyz2[0]][xyz2[1]] = 1;
			}
		}
	}
    //익은것들 위치반환
	return firebe;
}


int main() {


	cin >> H >> N ;

	vector<XYZ> fire;
	int answer = 0;
	for (int i = 0; i < N; i++) {
		vec.push_back({});
		for (int j = 0; j < H; j++)
		{
			int a;
			cin >> a;
			vec[i].push_back(a);

			if (a == 1)
			{
				fire.push_back(XYZ(i, j));
			}
			if (a == 0) {
				nonfire.push_back(XYZ(i, j));
			}

		}
	}

	while (true)
	{
    
		if (fire.size() <= 0)
			break;
		//다음으로 익을 토마토 구하기
        fire = findNextTomato(fire);
		
        //일자 업데이트 
		answer++;
	}
    
	for (auto a : nonfire) {
		if (vec[get<0>(a)][get<1>(a)] == 0)answer = 0;
	}
	cout << (answer - 1);

}

 

 

 

 

익은 위치와 익지않은 위치를 받아준뒤

 

 

}

while{

 

       func (익은 토마토들) 

             return이제 익은 토마토 위치 반환

     

        반복하며 answer+1

}

 

}

 


위와 같은 행위를  결국 익을게 없을때 까지 반복한다.

더이상 익을게 없을때

 

안익었던 토마토들이 아직도 익지않았는지 확인한다.

 

 

매우 쉬운코드 

 


예전에 짠코드여서 왜 그랬는지 모르겠지만 queue를 써봤다가 안쓰고 vector로 풀어보려고 풀어보았던거 같다.

 

queue로 BFS를 풀고 얕은복사를 좀더 활용하는게 좋을거같다.

 

 

만약 시각적으로 보면서 확인해야 이해하기 쉬울거 같다 생각한다면! 

	while (true)
	{
		if (fire.size() <= 0)
			break;
		fire = findNextTomato(fire);

		//cout << endl;

		for (auto x : vec) {
			for (auto y : x) {
				cout << y;
				cout << " ";
			}
			cout << endl;

		}

		answer++;
	}

 

 

를 추가해서 점점 퍼지는걸 볼수있따 :-)

 

 

 

+ Recent posts