Problem B: Minesweeper (Uva 10189)

 Problem B: Minesweeper 

 

The Problem

Have you ever played Minesweeper? It's a cute little game which comes within a certain Operating System which name we can't really remember. Well, the goal of the game is to find where are all the mines within a MxN field. To help you, the game shows a number in a square which tells you how many mines there are adjacent to that square. For instance, supose the following 4x4 field with 2 mines (which are represented by an * character):

*...
....
.*..
....

If we would represent the same field placing the hint numbers described above, we would end up with:

*100
2210
1*10
1110

As you may have already noticed, each square may have at most 8 adjacent squares.

The 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 stands for the number of lines and columns of the field respectively. The next n lines contains exactly m characters and represent the field. Each safe square is represented by an "." character (without the quotes) and each mine square is represented by an "*" character (also without the quotes). The first field line where n = m = 0 represents the end of input and should not be processed.

The Output

For each field, you must print the following message in a line alone:

Field #x:

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 adjacent mines to that square. There must be an empty line between field outputs.

Sample Input

 

4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0

 

Sample Output

 

Field #1:
*100
2210
1*10
1110

Field #2:
**100
33200
1*100


 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include <string.h>
 5 
 6 int main(int argc, const char *argv[])
 7 {
 8   int n, m;
 9   int i, j;
10   int p, q;
11   char mine[100][100];
12   int x1, x2, y1, y2;
13   int count;
14   int num = 0;
15 
16   while (scanf("%d %d", &n, &m) && (n != 0 || m != 0)) {
17     if (num != 0) printf("\n");
18     num++;
19     getchar();
20     for (i = 0; i < n; i++) {
21       for (j = 0; j < m; j++) {
22     scanf("%c", &mine[i][j]);
23       }
24       getchar();
25     }
26 
27     printf("Field #%d:\n", num);
28 
29     for (i = 0; i < n; i++) {
30       for (j = 0; j < m; j++) {
31     if (mine[i][j] == '*') {
32       printf("*"); 
33       continue;
34     }
35 
36     if (j - 1 < 0) x1 = 0;
37     else x1 = j - 1;
38 
39     if (j + 1 > m-1) x2 = m - 1;
40     else x2 = j + 1;
41 
42     if (i - 1 < 0) y1 = 0;
43     else y1 = i - 1;
44 
45     if (i + 1 > n-1) y2 = n - 1;
46     else y2 = i + 1;
47 
48     count = 0;
49     for (p = y1; p <= y2; p++) {
50       for (q = x1; q <= x2; q++) {
51         if (p == i && q == j) continue;
52         if (mine[p][q] == '*')
53           count++;
54       }
55     }
56     printf("%d", count);
57       } 
58       printf("\n");
59     }
60   }
61     return 0;
62 }
View Code

总结:

  问题很简单,但是在编写代码时,对代码的掌控不是很精准,造成许多小BUGS,有待进一步的加强。

posted @ 2013-05-15 12:42  楼兰故居  阅读(181)  评论(0)    收藏  举报