Minesweeper-Java

题目描述:

你玩过扫雷船吗?这个可爱的小游戏有一个我们不记得名字的操作系统。
游戏的目标是找出所有的地雷在一个MxN场内的位置。
游戏显示一个正方形中的一个数字,它告诉你在那个方块附近有多少个地雷。
每个广场最多有八个相邻的方块。
左边的4x4字段包含两个地雷,每个地雷都以“*”字符表示。
如果我们用上面描述的暗示数来表示同一个字段,
我们就会得到右边的字段:*.*.....*100 2210 1*10 1110

输入:

输入将由任意数目的字段组成。
每个字段的第一行包含两个整数n和m(0<n,m$100),它们分别代表字段的行数和列数。
下面n行中的每一行都精确地包含m个字符,表示字段。
安全方格用'.'表示。地雷方格是'*',两者都没有引号。
第一个字段行,其中n=m=0表示输入的结尾,不应该进行处理。

输出:

对于每个字段,只在一行上打印消息字段#x:,其中x代表从1开始的字段数。
下n行应该包含带有'.'的字段。
字符替换为与该方格相邻的地雷数。字段输出之间必须有空行。

样例输入:

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

样例输出:

Field #1:
*100
2210
1*10
1110

Field #2:
**100
33200
1*100

参考解答:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int line_num, column_num;
		line_num = sc.nextInt();
		column_num = sc.nextInt();
		String temp = sc.nextLine();
		int sum = 1;
		
		while (line_num != 0 && column_num != 0) {
			String[] str = new String[line_num];
			for (int i = 0; i < line_num; i++) {
				str[i] = sc.nextLine();
			}
			
			System.out.println("Field #" + (sum++) + ":");
			char[][] char_array = new char[line_num][column_num];
			for (int i = 0; i < line_num; i++) {
				char_array[i] = str[i].toCharArray();
			}
			count(char_array, line_num, column_num);
			System.out.println();
			line_num = sc.nextInt();
			column_num = sc.nextInt();
			temp = sc.nextLine();
		}
		
	}
	
	private static void count(char[][] str, int line_num, int column_num) {
		int[][] count = new int[line_num][column_num];
		
		for (int i = 0; i < line_num; i++) {
			Arrays.fill(count[i], -1);
		}
		for (int i = 0; i < line_num; i++) {
			for (int j = 0; j < column_num; j++) {
				if (str[i][j] == '.') {
					count[i][j] = sum(str, i, j, line_num, column_num);
				}
			}
		}
		for (int i = 0; i < line_num; i++) {
			for (int j = 0; j < column_num; j++) {
				if (str[i][j] == '*') {
					System.out.print("*");
				}
				else {
					System.out.print(count[i][j]);
				}
			}
			System.out.println();
		}
	}
	
	private static int sum(char[][] str, int x, int y, int line_num, int column_num) {
		int sum = 0;
		for (int i = -1; i <= 1; i++) {
			for (int j = -1; j <= 1; j++) {
				if (notOutOfArrayBounds(x + i, y + j, line_num, column_num) && str[x + i][y + j] == '*') {
					sum++;
				}
			}
		}
		return sum;	
	}
	
	private static boolean notOutOfArrayBounds(int i , int j, int line_num, int column_num) {
		return (i >= 0 && i < line_num && j >= 0 && j < column_num);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值