본문 바로가기
알고리즘

[알고리즘] c++ cpp 봄버맨

by keel_im 2020. 10. 16.
반응형

포인트

1. 구현을 잘 할 수 있는가?

2. 맵을 바꾸는 방법을 잘 이해를 할 필요가 있다.

🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다. 

#include <iostream>
#include <string>

using namespace std;
int map[200][200]; // 빈 칸: 0, 폭탄: 터지기까지 남은 시간
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

int main() {
	int n, m, l;
	cin >> n >> m >> l;
	for (int i = 0; i < n; i++) {
		string s;
		cin >> s;
		for (int j = 0; j < m; j++) {
			if (s[j] == '.') {
				map[i][j] = 0;
			}
			else {
				map[i][j] = 2; // 처음 1초 동안은 아무 것도 하지 않고 시간만 가기 때문에, 2를 넣는다.
			}
		}
	}
	for (int t = 2; t <= l; t++) {
		if (t % 2 == 0) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (map[i][j] == 0) {
						map[i][j] = 3; // 폭탄이 아닌 곳에 폭탄 설치
					}
					else if (map[i][j] > 0) {
						map[i][j] -= 1; // 폭탄인 곳은 시간이 흐름
					}
				}
			}
		}
		else {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (map[i][j] == 1) {
						// 1초 남은 폭탄은 지금 터지는 폭탄
						map[i][j] = 0;
						for (int k = 0; k < 4; k++) {
							int x = i + dx[k];
							int y = j + dy[k];
							if (0 > x || x >= n || 0 > y || y >= m) continue;

							if (map[x][y] != 1) {
								// 인접한 칸이 1초 남은 폭탄이 아니면, 이번에 터지는 폭탄이 아님 또는 빈 칸
								map[x][y] = 0;
							}
						}
					}
				}
			}

			for (int i = 0; i < n; i++) {
				for (int j = 0; j < m; j++) {
					if (map[i][j] > 0) {
						map[i][j] -= 1;
					}
				}
			}
		}
	}

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (map[i][j] == 0) {
				cout << '.';
			}
			else {
				cout << 'O';
			}
		}
		cout << '\n';
	}
	
	return 0;
}

 

반응형

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

[알고리즘] c++ cpp 두 개 뽑아서 더하기  (0) 2020.10.20
[알고리즘] c++ cpp 다리 만들기  (0) 2020.10.17
[알고리즘] 퇴사  (0) 2020.10.15
[알고리즘] 2048 (Easy)  (0) 2020.10.15
[알고리즘] cpp c++ 다리 만들기2  (0) 2020.10.14

댓글