蓝桥杯真题 --- 清理水域

题目

问题描述

小蓝有一个 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. 根据给出的输入样例可以很找出规律:
    • 假设已被清理的状态用 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)位置的水域已被清理,所以不用再改变水域的状态
  2. 通过分析演示清理水域的过程,可以发现解题的关键在于:清理水域以及清理水域范围的表示
    • 清理水域:
      1. 某位置水域状态为 0 且在水域范围内 时,该水域位置状态置 1
      2. 水域状态为 1 时,不改变水域状态
    • 清理水域范围的表示:
      1. 因为清理水域的范围是矩形,第一感觉是使用数组记录水域范围
      2. 但转念一想,好像也不需要保存相关数据,只需要给定清理水域的遍历范围即可
      3. 因此,使用四个变量记录水域范围即可实现
	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);  
	    }  
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值