题目
问题描述
小蓝有一个 n×m 大小的矩形水域,小蓝将这个水域划分为 n 行 m 列,行数从 1 到 n 标号,列数从 1到 m 标号。每行和每列的宽度都是单位 1 。
现在,这个水域长满了水草,小蓝要清理水草。
每次,小蓝可以清理一块矩形的区域,从第 r1 行(含)到第 r2 行(含)的 第 c1 列(含)到 c2 列(含)。
经过一段时间清理后,请问还有多少地方没有被清理过。
输入格式
输入第一行包含两个整数 n,m,用一个空格分隔
第二行包含一个整数 t ,表示清理的次数。
接下来 t 行,每行四个整数 r1,c1,r2,c2,相邻整数之间用一个空格分隔,表示一次清理。请注意输入的顺序。
输出格式
输出一行包含一个整数,表示没有被清理过的面积。
样例输入
2 3
2
1 1 1 3
1 2 2 2
样例输出
2
样例输入
30 20
2
5 5 10 15
6 7 15 9
样例输出
519
评测用例规模与约定
对于所有评测用例,1≤r1≤r2≤n≤100,1≤c1≤c2≤m≤100,0≤t≤100。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题
- 根据给出的输入样例可以很找出规律:
- 假设已被清理的状态用 1 表示, 未被清理的区域用 0 表示
- 因此,2 x 3 大小的矩形水域的初始状态如下:
0 0
0 0
0 0 - 随后,清理水域
- 第一次清理水域:x轴: 1 -> 1 ,y轴:1 -> 3,如下所示:
1 0
1 0
1 0 - 第二次清理水域:x轴:1 -> 2,y轴:2 -> 2,如下所示:
1 0
1 1
1 1
注意: 在第二次清理水域时,(2,1)位置的水域已被清理,所以不用再改变水域的状态
- 通过分析演示清理水域的过程,可以发现解题的关键在于:清理水域以及清理水域范围的表示
- 清理水域:
- 某位置水域状态为 0 且在水域范围内 时,该水域位置状态置 1
- 水域状态为 1 时,不改变水域状态
- 清理水域范围的表示:
- 因为清理水域的范围是矩形,第一感觉是使用数组记录水域范围
- 但转念一想,好像也不需要保存相关数据,只需要给定清理水域的遍历范围即可
- 因此,使用四个变量记录水域范围即可实现
- 清理水域:
package 蓝桥杯题库题解;
import java.util.Scanner;
public class 清理水域 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int t = sc.nextInt();
int[][] sy = new int[n+1][m+1];
int i,j,k,sum = 0;
for(i = 0;i < t; i++){
int r1 = sc.nextInt();
int c1 = sc.nextInt();
int r2 = sc.nextInt();
int c2 = sc.nextInt();
for (j = r1; j <= r2; j++){
for (k = c1; k <= c2; k++){
if(sy[j][k] == 1) {
continue;
}
sy[j][k] = 1;
sum++;
}
}
}
System.out.println(n * m - sum);
}
}