JAVA 超详解洛谷入门P1789 【Mc生存】插火把(谁看谁会)

目录

题目

代码

详解步骤

一:接受数据

二:创建数组

三.再次接受

四.插火把

五.放萤石.

六.遍历

本题只用到了二维数组的基础知识(不到五十行代码)

题目

相信大家在做这道题的时候都会有一个小疑问?那就是如果我插的火把和萤石在不同的位置时,它好像亮的情况不一样,这种题最容报错的情况就是索引越界异常(RE).下面,我提供一下我自己的思路,来完全避免这种问题(附代码):

首先,我们在创建二维数组的时候,在n x n方阵的上下左右都多打印两行或两列,使我们的n x n 的方阵完全被包裹起来.然后再将火把和萤石放到内部方阵里面,按照一般情况将它四周固定位置点亮,这样就保证了索引不会越界和多种情况的复杂代码了.最后在打印的时候只打印内部的n x n方阵就ok了

代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int k = sc.nextInt();
        boolean [][]arr =new boolean[n+4][n+4];
        //插火把
        for (int i = 1; i <= m; i++) {
            int x = sc.nextInt()-1;
            int y = sc.nextInt()-1;
            for (int i1 = y; i1 <= y+4; i1++) {
                arr[x+2][i1]=true;
            }
            for (int i1 = x; i1 <= x+4; i1++) {
                arr[i1][y+2]=true;
            }
            arr[x+1][y+1]=true;
            arr[x+1][y+3]=true;
            arr[x+3][y+1]=true;
            arr[x+3][y+3]=true;
        }

        //放萤石
        for (int i = 0; i < k; i++) {
            int o = sc.nextInt()-1;
            int p = sc.nextInt()-1;
            for (int j = p; j <=p+4 ; j++) {
                arr[o+2][j]=true;
                arr[o+1][j]=true;
                arr[o][j]=true;
                arr[o+3][j]=true;
                arr[o+4][j]=true;
            }
        }//遍历
            int count = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if(!arr[i+2][j+2]){
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

上方就是我写的代码了,下面我对每个步骤做出解释

详解步骤

一:接受数据

用题目上的字母去接受相应的数据

二:创建数组

创建布尔类型二维数组来代表方阵的时候多创建四行四列(布尔类型默认值为false,代表黑)

三.再次接受

根据接受的m ,和k数据来判断我们接下来需要再接受几组 x,y数据,我用的是for循环来保证接受数量的

四.插火把

首先将接受的x,y数据-1.因为数组是从0开始的,而坐标是从1开始的

其次,用两个for循环将火把那一行五个和一列五个都给赋值true,然后再单独赋值四个角的值

重点:因为你在方阵的上下左右都多打印了两行,因此赋值时每个索引都应该在原本的基础上+2

五.放萤石.

基本和插火把差不多,就是用for循环对指定的五个列或行对里面的五个指定位置进行赋值

六.遍历

在循环外边定义一个变量,用来记录暗处有多少个

然后基础的二维数组遍历,记住i 和 j的值一定要小于n,因为你只遍历n x n方阵,然后找到遍历的起始点就可以了,以其实点开始进行向左向右n x n 的遍历

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值