본문 바로가기

알고리즘

[C/C++] 코드업(codeup) 3500번 지뢰 찾기 2

▽문제 바로가기

https://codeup.kr/problem.php?id=3500

 

지뢰 찾기 2

(r, c)를 선택한 경우 맵의 상태를 화면에 출력하시오. 만약 (r, c)가 지뢰이면 그 칸은 -1로 출력한다.

codeup.kr


입력

9*9의 지뢰 찾기 맵의 정보가 입력된다. ( 0: 빈칸 , 1 : 지뢰 )

10번째 행에 (r, c)의 정보가 차례대로 입력된다. ( 1 <= r, c <= 9 )

 

출력

(r, c)를 선택한 경우 맵의 상태를 화면에 출력하시오. 만약 (r, c)가 지뢰이면 그 칸은 -1로 출력한다.

 

문제 풀이

 

주위 8칸을 탐색해서 지뢰가 없으면 계속 탐색하고 지뢰가 있으면 지뢰 개수를 표시하면 됩니다. 이미 탐색한 곳은 방문처리를 해서 다시 탐색하지 않도록 해야 합니다.

 

#include <stdio.h>

using namespace std;

int arr[11][11] = {0,};
char map[11][11]; 
bool check[11][11] = {false,};
int r, c;

//주위 8칸 지뢰갯수 구하는 함수
int find_mine(int r, int c){
	int dy[8] = {0, 0, 1, 1, 1, -1, -1, -1};
	int dx[8] = {-1, 1, -1, 0, 1, -1, 0, 1};
	
	int cnt = 0;
	for(int i=0;i<8;i++){
		if(arr[r+dy[i]][c+dx[i]]==1) cnt++;
	}
	
	return cnt;
}


void dfs(int r, int c){
	//맵 벗어나면 리턴
	if(r==0||c==0||r==10||c==10) return;
	
	check[r][c] = true;	//방문처리 
	int mine = find_mine(r, c);
	//주위8칸에 지뢰없으면 계속탐색
	if(mine==0){
		map[r][c] = '0';	//0으로 표시하고
		if(!check[r-1][c]) dfs(r-1, c);	//위로탐색 
		if(!check[r][c-1]) dfs(r, c-1);	//왼쪽으로탐색 
		if(!check[r][c+1]) dfs(r, c+1);	//오른족으로탐색 
		if(!check[r+1][c]) dfs(r+1, c); //밑으로탐색
		if(!check[r-1][c-1]) dfs(r-1, c-1);	//왼쪽위 대각선 
		if(!check[r-1][c+1]) dfs(r-1, c+1);	//오른쪽위 대각선 
		if(!check[r+1][c-1]) dfs(r+1, c-1);	//왼쪽아래 대각선 
		if(!check[r+1][c+1]) dfs(r+1, c+1);	//오른쪽아래 대각선 
	}
	
	//지뢰있으면 맵에표시하고 리턴
	else{
		map[r][c] = mine+48;
		return; 
	}
	 
}

int main(){
	//[1] ~ [9] 지뢰 맵
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++){
			scanf("%d", &arr[i][j]);
			map[i][j] = '_';
		}
	}
	
	scanf("%d%d", &r, &c);
	//r, c가 지뢰인지판단
	bool isMine = false;
	if(arr[r][c]==1) isMine = true;
	else dfs(r, c);
	
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++){
			if(isMine&&r==i&&c==j) printf("-1 ");
			else printf("%c ", map[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}