▽문제 바로가기
https://codeup.kr/problem.php?id=3500
입력
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;
}
'알고리즘' 카테고리의 다른 글
[C/C++] 코드업(codeup) 4024번 호수의 수 구하기 (0) | 2020.02.24 |
---|---|
[C/C++] 코드업(codeup) 4023번 오목 (0) | 2020.02.23 |
[C/C++] 코드업(codeup) 3212번 위상 정렬(topological sort) (0) | 2020.02.21 |
[C/C++] 코드업(codeup) 2610번 그림판 채우기 (0) | 2020.02.20 |
[C/C++] 코드업(codeup) 2605번 캔디팡 (0) | 2020.02.19 |