标题:油漆面积

X星球的一批考古机器人正在一片废墟上考古。

该区域的地面坚硬如石、平整如镜。

管理人员为方便,建立了标准的直角坐标系。

每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。

经过各种测量,每个机器人都会报告一个或多个矩形区域,作为优先考古的区域。

矩形的表示格式为(x1,y1,x2,y2),代表矩形的两个对角点坐标。

为了醒目,总部要求对所有机器人选中的矩形区域涂黄色油漆。

小明并不需要当油漆工,只是他需要计算一下,一共要耗费多少油漆。

其实这也不难,只要算出所有矩形覆盖的区域一共有多大面积就可以了。

注意,各个矩形间可能重叠。

本题的输入为若干矩形,要求输出其覆盖的总面积。

输入格式:

第一行,一个整数n,表示有多少个矩形(1<=n<10000)

接下来的n行,每行有4个整数x1 y1 x2 y2,空格分开,表示矩形的两个对角顶点坐标。

(0<= x1,y1,x2,y2 <=10000)

输出格式:

一行一个整数,表示矩形覆盖的总面积。

例如,

输入:

3

1 5 10 10

3 1 20 20

2 7 15 17

程序应该输出:

340

再例如,

输入:

3

5 2 10 6

2 7 12 10

8 1 15 15

程序应该输出:

128

import java.util.Scanner;

public class youqiwenti3 {
static int n, sum = 0;
static int[][] p = new int[1000][10000];
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
for (int i = 0; i < n; i++) {
int x1 = in.nextInt();
int y1 = in.nextInt();
int x2 = in.nextInt();
int y2 = in.nextInt();
paint(x1, y1, x2, y2);
}
for (int i = 0; i < p.length; i++) {
for (int j = 0; j < p[i].length; j++) {
sum += p[i][j];
}
}
System.out.println(sum);
}
private static void paint(int x1, int y1, int x2, int y2) {
// TODO Auto-generated method stub
for (int i = x1; i < x2; i++) {
for (int j = y1; j < y2; j++) {
p[i][j] = 1;
}
}
} }

其实还可以用io包来优化,上面的也可以过测试用例,下面这个在io输入上进行了优化

import java.io.BufferedReader;
import java.io.InputStreamReader; public class youqiwenti {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // 储存每个矩形的坐标
int[][] shape = new int[n][4];
for (int i = 0; i < n; i++) {
String[] nums = br.readLine().split(" +");
//下标0为x1,1为y1,2为x2,3为y2
for (int j = 0; j < 4; j++) {
shape[i][j] = Integer.parseInt(nums[j]);
}
}
br.close();
// 求出矩形中最大的x和y坐标值
int maxX = 0;
int maxY = 0;
for (int i = 0; i < n; i++) {
if (shape[i][0] > maxX) {
maxX = shape[i][0];
}
if (shape[i][2] > maxX) {
maxX = shape[i][2];
} if (shape[i][1] > maxY) {
maxY = shape[i][1];
}
if (shape[i][3] > maxY) {
maxY = shape[i][3];
}
} // 创建一个数组表示所有区域,同时也是为了记录是否访问过
boolean[][] visited = new boolean[maxX + 1][maxY + 1]; //依次把矩形放入所有区域
for (int i = 0; i < n; i++) {
place(i, shape, visited);
} int area = 0;
//遍历所有区域,计算面积
for (int i = 0; i < visited.length; i++) {
for (int j = 0; j < visited[i].length; j++) {
if (visited[i][j]) {
area++;
}
}
} System.out.println(area);
} /**
* 将矩形点放入所有区域中
*
* @param i
* @param shape
* @param visited
*/
private static void place(int i, int[][] shape, boolean[][] visited) {
// 确保x1,y1分别比x2,y2小
if (shape[i][0] > shape[i][2]) {
int temp1 = shape[i][0];
shape[i][0] = shape[i][2];
shape[i][2] = temp1;
} if (shape[i][1] > shape[i][3]) {
int temp2 = shape[i][1];
shape[i][1] = shape[i][3];
shape[i][3] = temp2;
} for (int x = shape[i][0]; x < shape[i][2]; x++) {
for (int y = shape[i][1]; y < shape[i][3]; y++) {
// if (!visited[x][y]) {//这里没有必要做判断,做了判断消耗的时间反而更多
visited[x][y] = true;
// }
}
} } }

Java实现 蓝桥杯油漆问题的更多相关文章

  1. 日期求星期(java)-蓝桥杯

    日期求星期问题(java)-蓝桥杯 1:基姆拉尔森计算公式(计算星期) 公式: int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 此处y,m,d指代年 ...

  2. Java实现 蓝桥杯VIP 基础练习 高精度加法

    java算法 蓝桥杯 高精度加法 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数 ...

  3. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  4. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  5. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  6. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

  7. 日期类的使用(java)-蓝桥杯

    蓝桥杯日期问题常考,java提供了日期类很方便: //日历类 Calendar c = Calendar.getInstance(); // 获取实例化对象 Date date =c.getTime( ...

  8. java算法 蓝桥杯 文化之旅

    问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化 ...

  9. java算法 蓝桥杯 摆花

    问题描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

随机推荐

  1. boost在Qt中的使用

    一.说明 理论上,Qt和boost是同等级别的C++库,如果使用Qt,一般不会需要再用boost,但是偶尔也会有特殊情况,比如,第三方库依赖等等.本文主要介绍boost在windows Qt(MinG ...

  2. 【Scala】什么是隐式转换?它又能用来干嘛?该怎么用

    文章目录 定义 隐式参数 隐式转换 隐式值:给方法提供参数 隐式视图 将Int和Double类型转换为String 狗狗学技能(使用别的类中的方法) 使用规则 定义 隐式参数 隐式参数指在函数或者方法 ...

  3. 【Spark】必须要用CDH版本的Spark?那你是不是需要重新编译?

    目录 为什么要重新编译? 步骤 一.下载Spark的源码 二.准备linux环境,安装必须软件 三.解压spark源码,修改配置,准备编译 四.开始编译 为什么要重新编译? 由于我们所有的环境统一使用 ...

  4. 用PHP获取网页上的信息相对于xpath效率低点

    用php实现对网页的抓取,及信息的收集,其实就是爬数据,具体实现步骤如下,首先应引入两个文件curl_html_get.php和save_file.php文件,两个文件具体代码是这样的curl_htm ...

  5. 使用Optional,不再头疼NPE

    前言 在 Java 语言开发中,可能大多数程序员遇到最多的异常就是 NullPointException 空指针异常了.这个当初语言的开发者"仅仅因为这样实现起来更容易"而允许空引 ...

  6. Js 事件基础

    一:js中常见得事件 (1) : 鼠标事件         click :点击事件         dblclick :双击事件         contextmenu : 右键单击事件        ...

  7. linux(ubuntu) 1045, "Access denied for user 'root'@'localhost' (using password: YES)"

    问题现象: 最近使用 flask 的 sqlalchemy 框架,在链接数据库(mysql)时出现报错 sqlalchemy.exc.OperationalError: (pymysql.err.Op ...

  8. markdonwn 测试1

    标题测试 ## 二级标题 ### 三级标题 二级标题 三级标题 段落格式 换行 末尾两个空格 第一行第一行第一行第一行第一行第一行第一行第一行 第二行第二行第二行第二行第二行第二行第二行第二行 第一行 ...

  9. 移动端纯css超出盒子出现横向滚动条

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. ReactNative报错:Can't find variable: __fbBatchedBridge

    最近开始研究ReactNative,首先根据网上教程 http://www.codeceo.com/article/windows-react-native-android.html 一步一步来.完成 ...