每周一题之2 Mineweep(扫雷)
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
坑点:
- 注意输出Field #序号(在这里WA了好多次)
- 每一次输出之后都有一行空格,但最后一行没有(又在这里PE了好多次)
实现代码:
//代码其实很简单,遍历二维数组,然后在其周围搜素有没有雷就可以了
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n;
int m;
int count = 1;
while(in.hasNext()) {
n = in.nextInt();
m = in.nextInt();
if(n==0 && m==0) {
break;
}
char[][] lq = new char[n][m];//雷区
for (int i = 0; i < lq.length; i++) {
String line = in.next();
for (int j = 0; j < line.length(); j++) {
lq[i][j] = line.charAt(j);
}
}
Object[][] lqLast = new Object[n][m];//最后生成的雷区
for (int i = 0; i < lqLast.length; i++) {
for (int j = 0; j < lqLast[i].length; j++) {
if(lq[i][j]=='*') {
lqLast[i][j] = '*';
}else {
int lNum = 0;//正方形区域中雷的数量
int top = (i-1)<0?0:(i-1);//上
int end = (i+1)>=lq.length?lq.length-1:(i+1);//下
int left = (j-1)<0?0:(j-1);//左
int right = (j+1)>=lq[0].length?lq[0].length-1:(j+1);//右
for (int k = top; k <= end; k++) {
for (int k2 = left; k2 <= right; k2++) {
if((k!=i || k2!=j) && lq[k][k2]=='*') {
lNum++;
}
}
}
lqLast[i][j] = lNum;
}
}
}
if(count>1) {
System.out.println();
}
System.out.println("Field #"+count+":");
for (int i = 0; i < lqLast.length; i++) {
for (int j = 0; j < lqLast[i].length; j++) {
System.out.print(lqLast[i][j]);
}
System.out.println();
}
count++;
}
}
}