标题:油漆面积

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. JDBC03 Statement接口

    Statement接口 用于执行静态SQL语句并返回它所生成结果的对象 三种Statem类 Statement:由createStatement创建,用于发送简单的SQL语句(不带参数的),会有SQL ...

  2. 存储过程——公用表表达式(CTE)

    目录 0. 背景说明 1. 定义及语法细节 1.1 基本定义 1.2 基本语法 1.3 多个CTE同时声明 1.4 CTE嵌套使用 2. CTE递归查询 2.1 简介 2.2 准备工作 2.3 计算每 ...

  3. 【SMB源码解析系列】——003.SMB游戏基本框架

    前面有了解到RESET中断相关代码,结尾处通过一句jmp进入了无限循环,之后CPU将会在每一帧PUU进入VBlank状态时,接收NMI中断信号, 跳转至NMI代码处继续执行,直到遇见RTI指令时又返回 ...

  4. 2.C#Panel扩展控件

    1.解决方案下添加新建项目新建类库 2. 在项目下添加新建项选择新建组件类 3.先引用,然后导入两个命名空间 4.因为是扩展控件,把继承自Component改成继承自Panel using Syste ...

  5. 根据ip查询ip归属地

    http://www.oschina.net/code/snippet_944819_33978 http://www.jb51.net/article/54287.htm public String ...

  6. swiper插件在移动端,多个swiper左右滑动时有空白的问题

    之前在项目上用到了多个swiper.但是结构结构代码css.以及js  几乎一样的除了第一个swiper左右滑动有回弹.其他都没有回弹.于是尝试了各种方法都不行. 百思不得其解 ,最后在官网终于找到了 ...

  7. docker的file内容解释

    关键字---重点啊) FROM 基础镜像,当前新镜像是基于哪个镜像的 MAINTAINER  镜像维护者的姓名和邮箱地址 RUN  容器构建时需要运行的命令 EXPOSE 当前容器对外暴露的端口 WO ...

  8. 【译】OWIN: Open Web Server Interface for .NET

    主要是使用 OAuth 时,它运行在 OWIN 上,然后又出了若干问题,总之,发现对 IIS.ASP.NET 和 OWIN 理解一塌糊涂. 后面看到 OWIN: Open Web Server Int ...

  9. Network Motif 文献调研

    Network Motif 文献调研 概述:Network motifs,可以认为是网络中频繁出现的子图模式,是复杂网络的"构建块".有两篇发表在science上的论文给出moti ...

  10. Redis学习笔记(1)

    一.NoSQL基础知识 1. NoSQL概念 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库 ...