【Java】P2670 [NOIP2015 普及组] 扫雷游戏

d28

题目

思路

关键点:定义一个比arr0(记录雷区情况的数组)多两行两列的数组 arr,将arr0放入arr

arr上下左右各比arr0多一行,这样能避免越界问题(但是我不理解原本写法为什么越界)


思路:

将雷区情况存入数组arr0,定义一个比arr0多两行两列的数组 arr,将arr0放入大数组arr

遍历大数组:

如果是'*'则输出* 

如果不是,定义一个计数器,遍历附近九宫格,如果有*,就c++,最后输出c


                    int c = 0;
                    for (int k = i - 1; k <= i + 1; k++) {
                        for (int l = j - 1; l <= j + 1; l++) {
                            if (arr[k][l] == '*')
                            c++;
                        }
                    }
                    System.out.print(c);
                

思路有参考:【模拟与高精度】【JAVA】P2670 [NOIP2015 普及组] 扫雷游戏_p2670 [noip2015 普及组] 扫雷游戏c stdio-CSDN博客

代码

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        char[][] arr0 = new char[n][m];//本身
        char[][] arr = new char[n + 2][m + 2];//拓展后的数组
        //分行读取字符
        for (int i = 0; i < n; i++) {
            String a = in.next();//第n行
            char[] temp = a.toCharArray();
            for (int j = 0; j < m; j++) {
                arr0[i][j] = temp[j];
            }
        }

        //将arr的元素都定义为!;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                arr[i][j] = '!';
            }
        }
        //将arr0放入arr中
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                arr[i + 1][j + 1] = arr0[i][j];
            }
        }

        for (int i = 1; i < n + 2 - 1; i++) {
            for (int j = 1; j < m + 2 - 1; j++) {
                if (arr[i][j] == '*') {
                    System.out.print('*');
                } else {
                    int c = 0;
                    for (int k = i - 1; k <= i + 1; k++) {
                        for (int l = j - 1; l <= j + 1; l++) {
                            if (arr[k][l] == '*')
                            c++;
                        }
                    }
                    System.out.print(c);
                }
            }
            System.out.println();
        }

    }
}

记录

29号的题目,30号终于写出来

问题1:Scanner 的各种next用法不是很明了

不明白为什么用next 不能用nextLine()

问题2:数组总是越界,不知道为什么

问题3:当一个算法一直想不通,就换一个算法,目的是用一个更好的方法把题目写出来,有问题卡壳,就换一种写法。写出来以后再去研究哪里出问题

笔记:

基本数据类型用==

引用类型用equals()方法,比如说 String

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值