본문 바로가기
프로그램/C언어 1000제

C언어 199제] 지뢰 찾기(Minesweeper)

by 건티 2024. 12. 19.
728x90

출처 : 반크_백제역사 유적지구 및 이스탐블역사 유적지구

 

문제]

지뢰 찾기를 해본 적이 있는 독자들이 많을 것이다. 이름은 잘 기억나지 않지만 어떤 운영체제에 이 작고 귀여운 게임이 깔려있다. 지뢰 찾기는 M X N 크기의 지뢰밭에서 모든 지뢰의 의치를 찾아내는 게임이다.
이 게임에서는 각 칸에 인접한 칸에 몇 개의 지뢰가 있는지를 보여준다. 각 칸에는 최대 여덟 개의 인접한 칸이 있을 수 있다. 아래에서 왼쪽에 있는 4X4 지뢰밭에는 지뢰 두 개가 있으며 각각은 '*' 문자로 표시되어 있다. 이 지뢰밭을 방금 설명한 힌트 숫자로 표기하면 오른쪽에 있는 것과 같은 필드가 만들어진다.

* . . .       * 1 0 0
. . . .       2 2 1 0
. * . .      1 * 1 0
. . . .       1 1 1 0


입력
입력은 임의 개수의 지뢰밭으로 구성된다. 각 지뢰밭의 첫번째 줄에는 각각 행과 열의 개수를 나타내는 두 개의 정수 n과 m(0<n,m<=100)이 들어있다. 그 다음 줄부터는 n개의 줄에 걸쳐서 각 줄마다 정확하게 m개씩의 문자가 들어있으며 이는 지뢰밭을 처리하지 않는다.

출력
각 지뢰밭에 대해 Field #x:라고 적혀있는 메세지를 출력한다. 이때 x는 필드 번호를 나타내며 1에서 시작한다. 그 다음 줄부터는 n개의 줄에 걸쳐서 '.'문자 대신 그 칸에 인접한 칸에 들었는 지뢰의 개수를 출력한다. 각 지뢰밭에 대한 출력 사이에는 반드시 빈 줄이 하나씩 있어야 한다.

입력 예
4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0

출력 예
Field #1:
* 1 0 0
2 2 1 0
1 * 1 0
1 1 1 0

Field #2:
* * 1 0 0
3 3 2 0 0
1 * 1 0 0



출처]
Programming Challenges 알고리즘 트레이닝 북(한빛미디어) : 문제2 지뢰 찾기(Minesweeper) p40

 

참고풀이]

#include <stdio.h>

int main()
{
   char Row[101]={'\0'};//자료를 행단위로 입력받기 위한 배열변수
   char Board[102][102]={'\0'};//지뢰밭 보드변수
   int n,m;//행과 열 입력변수
   int r,c;//행,열 변수 또는 반복변수
   int i,j;//인덱스 또는 반복변수
   int cnt;//field 카운트 변수

   cnt=0;
   while(1)
   {
      cnt++;
      scanf("%d%d%*c",&n,&m); //행과 열의 수를 입력받는다.
      if(n==0 && m==0) break;
      if((n>0 && n<=100) && (n>0 && n<=100)) 
      {
         //board를 '0'으로 초기화
         for(r=1;r<=n;r++)
            for(c=1;c<=m;c++)
               Board[r][c]='0';

         //자료을 입력받으면서 처리하기
         for(r=1;r<=n;r++) 
         {
            scanf("%s%*c",Row);
            for(c=1;c<=m;c++)
            if(Row[c-1] == '*')
            {
               for(i=r-1;i<=r+1;i++)
                  for(j=c-1;j<=c+1;j++)
                     if(Board[i][j] != '*')
                        Board[i][j]++;
               Board[r][c]='*';
            }
         }

         //결과출력
         if(cnt>1) printf("\n");
         printf("Field #%d:\n",cnt);
         for(r=1;r<=n;r++)
         {
            for(c=1;c<=m;c++)
               putchar(Bord[r][c]);
            putchar('\n');
         }
      }
   }

   return 0;
}

 

참고풀이 결과]

 

 

 

 

 

대한민국의 아름다운 영토, 독도의 여름

 

반응형

댓글