Vinícius Oliveira

I love coding.

Programming Challenges - Minesweeper

Problem Minesweeper

Have you ever played Minesweeper? This cute little game comes with a certain op- erating system whose name we can’t remember. The goal of the game is to find where all the mines are located within a M × N field.
The game shows a number in a square which tells you how many mines there are adjacent to that square. Each square has at most eight adjacent squares. The 4 × 4 field on the left contains two mines, each represented by a “*” character. If we represent the same field by the hint numbers described above, we end up with the field on the right:

        *...    *100  
        ....    2210  
        .*..    1*10   
        ....    1110  

Input

The input will consist of an arbitrary number of fields. The first line of each field contains two integers n and m (0 < n, m ≤ 100) which stand for the number of lines and columns of the field, respectively. Each of the next n lines contains exactly m characters, representing the field.
Safe squares are denoted by “.” and mine squares by “*,” both without the quotes. The first field line where n = m = 0 represents the end of input and should not be processed.

Output

For each field, print the message Field #x: on a line alone, where x stands for the number of the field starting from 1. The next n lines should contain the field with the “.” characters replaced by the number of mines adjacent to that square. There must be an empty line between field outputs.

Solution

[++] (minesweeper.cpp) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <stdlib.h>

using namespace std;

#define M 10000
#define N 10000

char mine[M][N];
int size_m;
int size_n;
int test = 1;

int count_adjacent_mine(int pos_m,int pos_n){
  int count = 0;

  if (pos_m+1 < size_m && mine[pos_m+1][pos_n] == '*'){//0X0
      count++;
  }
  if (pos_m-1 >=0 && mine[pos_m-1][pos_n] == '*'){//0X0
      count++;
  }
  if (pos_m+1 < size_m && pos_n+1 < size_n &&  mine[pos_m+1][pos_n+1] == '*'){ //00X
      count++;
  }
  if (pos_m+1 < size_m && pos_n-1 >=0 &&  mine[pos_m+1][pos_n-1] == '*'){ //00X
      count++;
  }
  if (pos_m-1 >=0  && pos_n+1 < size_n &&  mine[pos_m-1][pos_n+1] == '*'){ //00X
      count++;
  }
  if (pos_m-1 >=0  && pos_n-1 >= 0 && mine[pos_m-1][pos_n-1] == '*'){//X00
      count++;
  }
  if (pos_n+1 < size_n && mine[pos_m][pos_n+1] == '*'){//00X
      count++;
  }
  if (pos_n-1 >=0 && mine[pos_m][pos_n-1] == '*'){//X00
      count++;
  }
  return count;
}

void print_all_count_adjacent_mine(){
   if (test > 1)    printf ("\n");

  printf ("Field #%d:\n",test++);
  for (int i = 0; i < size_m; i++){
      for (int j = 0; j < size_n; j++){
          if (mine[i][j] == '*'){
              printf ("*");
          }else{
              int total = count_adjacent_mine(i,j);
              printf ("%d",total);
          }    
      }
      printf ("\n");
  }
}

int main(){

  while (1){
      scanf ("%d%d",&size_m,&size_n);
      if (size_m == 0 && size_n == 0) break;
      for (int i = 0; i < size_m; i++){
          for (int j = 0; j < size_n; j++){
              scanf (" %c",&mine[i][j]);
          }
      }    
      print_all_count_adjacent_mine();
  }
  return 0;
}