본문 바로가기

알고리즘/BFS

백준 7576 토마토

그냥 눈대중으로 풀었다.

첫번째로 푼것 :

    
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef struct {
	int position;
	int time;
}tomato;


int M, N;
int Map[1000][1000];
queue q;
int min_count;
int dirx[4] = { 0,0,1,-1 };
int diry[4] = { -1,1,0,0 };
clock_t start, endi;

void Input() {
	
	scanf("%d %d", &M, &N);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &Map[i][j]);
			if (Map[i][j] == 1) {
				q.push({ i*M + j,0 });
			}
		}
	}
	
	start = clock();
}

int Calc() {
	while (!q.empty()) {
		int position = q.front().position;
		int count = q.front().time;
		q.pop();
		int depth = position / M;
		int width = position % M;

		if (min_count < count) {
			min_count = count;
		}
		 
		for (int i = 0; i < 4; i++) {
			int next_x = width+dirx[i];
			int next_y = depth+diry[i];
			
			if (next_x<0 || next_x>=M || next_y<0 || next_y>=N || Map[next_y][next_x] != 0) continue;
			Map[next_y][next_x] = 1;
			q.push({ next_y*M + next_x ,count+1});
		}
	}

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			if (Map[i][j] == 0) return -1;
		}
	}
	endi = clock();
	printf("%.2f",(double)(endi - start) / CLOCKS_PER_SEC );
	return min_count;
}

void Solve() {
	Input();
	printf("%d", Calc());
}


int main(void) {
	Solve();
	return 0;
}

 

2. 두번째 :

i*M+j하는 연산을 세이브하고 따로 메모리 저장소를 만들어 사용해보았다. 그러나 메모리만 쓰고 시간은 같은 걸 봐선 큐에서 뭔가 값을 가져오는 연산 자체가 느리다는걸 알수 있다.

 

    
#include 
#include 
#include 
#include 
#include 
using namespace std;

typedef struct {
	int position_x;
	int position_y;
	int time;
}tomato;


int M, N;
int Map[1000][1000];
queue q;
int min_count;
int dirx[4] = { 0,0,1,-1 };
int diry[4] = { -1,1,0,0 };
//clock_t start, endi;

void Input() {
	
	scanf("%d %d", &M, &N);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &Map[i][j]);
			if (Map[i][j] == 1) {
				q.push({j,i,0 });
			}
		}
	}
	
	/*start = clock();*/
}

int Calc() {
	while (!q.empty()) {
		int positionx = q.front().position_x;
		int positiony= q.front().position_y;
		int count = q.front().time;
		q.pop();

		if (min_count < count) {
			min_count = count;
		}
		 
		for (int i = 0; i < 4; i++) {
			int next_x = positionx+dirx[i];
			int next_y = positiony+diry[i];
			
			if (next_x<0 || next_x>=M || next_y<0 || next_y>=N || Map[next_y][next_x] != 0) continue;
			Map[next_y][next_x] = 1;
			q.push({ next_x,next_y ,count+1});
		}
	}

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			if (Map[i][j] == 0) return -1;
		}
	}
	/*endi = clock();*/
	/*printf("%.2f",(double)(endi - start) / CLOCKS_PER_SEC );*/
	return min_count;
}

void Solve() {
	Input();
	printf("%d", Calc());
}


int main(void) {
	Solve();
	return 0;
}

'알고리즘 > BFS' 카테고리의 다른 글

백준 17142 연구소 3  (0) 2019.05.18
백준 11403 경로 찾기  (0) 2019.04.23
백준 1012번 유기농배추.  (0) 2019.04.23
백준 2667 단지 번호  (0) 2019.04.22