目录
本题只用到了二维数组的基础知识(不到五十行代码)
题目
相信大家在做这道题的时候都会有一个小疑问?那就是如果我插的火把和萤石在不同的位置时,它好像亮的情况不一样,这种题最容报错的情况就是索引越界异常(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 的遍历