오늘은 토요일,,, 어제 술을 너무 많이 먹고 실수를 해서 하루종일 기부니가 좋지않은 날이다.....

진짜 영어로 욕하고 싶은 날이다. 스윙스 맹키로;; 여 쉿! 음~ 여기까지

생각도 없앨겸 문제를 한문제 푸는데 문제를 풀면서도 계속 생각이 나고 마음이 진정이 되지 않았다.

하지만 문제는 1번 시도했는데 맞아버렸다;;;;; 그래도 기쁘지가 않았다. 앞으로 실수는 노노놉!!

이제 문제얘기로 돌아와서 이거 문제의 글이 제법 길어서 집중해서 읽어봤는데, 그냥 BFS이용해서 모두 탐색하면 되는것 같았다. 

치즈가 놓여있지 않은 외벽부터 시작해서 0으로 되어있는 곳을 모두 탐색을 한다. 그리고 공기와 붙어있는 1을 0으로 바꿔준다. 이때 갱신하면서 오류가 날수있기  때문에 copy_board를 만들어줬는데, 흠 꼭 필요했나 싶기도 하다. 방문을 했는지 여부를 이용해서 해도 될것같았기 때문이다.

소스코드를 참고하고 언제나 피드백은 환영이다.

무엇보다 실수를 줄이자!! 쿄,,,,,,,,,,,,,,,,쿄

#include <iostream>
#include <queue>

using namespace std;

struct Que {
	int x;
	int y;
};

int board[102][102];
int copy_board[102][102];
bool vis[102][102];

int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };

void board_initialize() {
	for (int i = 0; i < 102; i++) {
		for (int j = 0; j < 102; j++) {
			board[i][j] = 0;
		}
	}
}

void vis_initialize() {
	for (int i = 0; i < 102; i++) {
		for (int j = 0; j < 102; j++) {
			vis[i][j] = false;
		}
	}
}


void copy_initialize() {
	for (int i = 0; i < 102; i++) {
		for (int j = 0; j < 102; j++) {
			copy_board[i][j] = 0;
		}
	}
}

void board_to_copy(int a, int b) {
	for (int i = 0; i < a; i++) {
		for (int j = 0; j < b; j++) {
			copy_board[i][j] = board[i][j];
		}
	}
}

bool mission_success(int a, int b) {
	bool success = true;
	for (int i = 0; i < a; i++) {
		for (int j = 0; j < b; j++) {
			if (board[i][j] == 1) {
				success = false;
				break;
			}
		}
		if (!success) break;
	}
	return success;
}



int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0);

	int a, b;
	int time = 0;
	int count = 0;

	cin >> a >> b;

	board_initialize();
	copy_initialize();

	for (int i = 0; i < a; i++) {
		for (int j = 0; j < b; j++) {
			cin >> board[i][j];
		}
	}


	while (!mission_success(a,b)) {
		board_to_copy(a, b);
		vis_initialize();

		queue<Que> Q;
		Q.push({ 0,0 });
		vis[0][0] = true;

		while (!Q.empty()) {
			auto cur = Q.front();
			Q.pop();

			for (int i = 0; i < 4; i++) {
				int nx = cur.x + dx[i];
				int ny = cur.y + dy[i];

				if (nx < 0 or nx >= a or ny < 0 or ny >= b) continue;
				if (copy_board[nx][ny] == 0 and vis[nx][ny] == false) {
					Q.push({ nx,ny });
					vis[nx][ny] = true;
				} else if (copy_board[nx][ny] == 1 and vis[nx][ny] == false) {
					board[nx][ny] = 0;
					vis[nx][ny] = true;
				}
			}
		}
		time++;
	}

	for (int i = 0; i < a; i++) {
		for (int j = 0; j < b; j++) {
			if (copy_board[i][j] == 1) {
				count++;
			}
		}
	} // 마지막에 남은 치즈 칸 수 세기

	cout << time << endl << count << endl;
	
}
//shout out to lynnnnnnnnn!

+ Recent posts