每周一题之2 Mineweep(扫雷)
Minesweeper (扫雷)
PC/UVa IDs: 110102/10189,
Popularity: A,
Success rate: high Level: 1
测试地址:https://vjudge.net/problem/UVA-10189
[问题描述]
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 M × N 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 4 × 4 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 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.
[输出]
对于每对整数 i 和 j,按原来的顺序输出 i 和 j,然后输出二者之间的整数中的最大循环节长度。这三个整数应该用单个空格隔开,且在同一行输出。对于读入的每一组数据,在输出中应位于单独的一行。
[样例输入]
4 4
*…
…
.*…
…
3 5
**…
…
.*…
0 0
[样例输出]
Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100
*/
package 蓝桥; import java.util.Scanner; public class 扫雷 { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); int a,b,sum=1; while (true) { a=scanner.nextInt(); b=scanner.nextInt(); if (a==0||b==0) { System.out.println("*/"); break; } System.out.println(); System.out.println("Field #"+sum+":"); sum++; char[][] lei=new char[a][b]; int[][] lei_int=new int[a][b]; for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { lei_int[i][j]=0; } } for (int i = 0; i < a; i++) { String tampString= scanner.next(); for (int j = 0; j < b; j++) { lei[i][j]=tampString.charAt(j); if (lei[i][j]=='*') { lei_int[i][j]=99; if (i>0&&lei_int[i-1][j]!=99) { lei_int[i-1][j]+=1; } if (i<a-1&&lei_int[i+1][j]!=99) { lei_int[i+1][j]+=1; } if (j>0&&lei_int[i][j-1]!=99) { lei_int[i][j-1]+=1; } if (j<b-1&&lei_int[i][j+1]!=99) { lei_int[i][j+1]+=1; } if (j>0&&i>0&&lei_int[i-1][j-1]!=99) { lei_int[i-1][j-1]+=1; } if (j<b-1&&i<a-1&&lei_int[i+1][j+1]!=99) { lei_int[i+1][j+1]+=1; } if (j>0&&i<a-1&&lei_int[i+1][j-1]!=99) { lei_int[i+1][j-1]+=1; } if (j<b-1&&i>0&&lei_int[i-1][j+1]!=99) { lei_int[i-1][j+1]+=1; } } } } for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { if (lei_int[i][j]==99) { System.out.print("*"); } else { System.out.print(lei_int[i][j]); } } System.out.println(); } } } }