어흥

[백준 2140] 지뢰찾기 (C++) 본문

알고리즘/백준

[백준 2140] 지뢰찾기 (C++)

라이언납시오 2020. 3. 9. 21:52
728x90
반응형

문제 링크: https://www.acmicpc.net/problem/2140

 

2140번: 지뢰찾기

지뢰찾기는 N×N에서 이뤄지는 게임이다. 보드의 곳곳에는 몇 개의 지뢰가 숨겨져 있고, 지뢰가 없는 칸에는 그 칸과 인접(상하좌우 및 대각선)해 있는 8개의 칸들에 몇 개의 지뢰가 숨겨져 있는지에 대한 정보가 주어진다. 게이머는 게임을 진행하면서 보드의 칸을 하나씩 열게 된다. 만약 그 칸에 지뢰가 있다면 게임이 끝나고, 없는 경우에는 그 칸에 적혀있는 숫자, 즉 그 칸과 인접해 있는 8개의 칸들 중 몇 개의 칸에 지뢰가 있는지를 알 수 있게 된다. 이

www.acmicpc.net

1. 주의할 점

- Queue를 이용해서 매번 검사할 경우 -> TLE 발생

- (N-2)*(N-2)형태의 중앙에 있는 정사각형의 경우 무조건 지뢰가 있다고 가정하고 나머지 경우에서 뺀다

- N이 2이하인 경우 지뢰는 항상 없다->(처리 안해주면 100%에서 틀린다)

 

2. 구현

- 해당 칸 주위에 0이 있는 경우 -> 지뢰없음으로 결과에서 1뺀다

- 없을 경우 -> 지뢰로 여긴다 -> 주위의 숫자중 1이상인 경우 1씩 감소한다 

#include <iostream>
#include <string>
using namespace std;
int arr[100][100];		//지뢰가 없는 칸:0, 지뢰가 있는 칸: 9
int dx[8] = { 0,1,1,1,0,-1,-1,-1 };
int dy[8] = { -1,-1,0,1,1,1,0,-1 };

int main() {
	int num;
	string str;
	char c;
	cin >> num;
	for (int i = 0; i < num; i++) {
		cin >> str;
		for (int j = 0; j < num; j++) {
			c = str[j];
			if (c == '#') arr[i][j] = -1;
			else arr[i][j] = str[j] - '0';			
		}
	}
	int result = 0;
	if (num>2) {
		result = (num - 2)*(num - 2);
		for (int i = 1; i < num - 1; i++) {
			for (int j = 1; j < num - 1; j++) {
				if (arr[i][j] == -1) {
					bool mine = true;
					for (int k = 0; k < 8; k++) {
						int nx = j + dx[k];
						int ny = i + dy[k];
						if (arr[ny][nx] == 0) {
							mine = false;
							result--;
							break;
						}
					}
					if (mine) {
						for (int k = 0; k < 8; k++) {
							int nx = j + dx[k];
							int ny = i + dy[k];
							if (0 < arr[ny][nx] && arr[ny][nx] < 9)
								arr[ny][nx]--;
						}
					}
				}
			}
		}
	}
	cout << result;
	system("pause");
	return 0;
}
728x90
반응형
Comments