前言
本题不涉及时间,内存限制,仅是以面向对象,通过图形化编程思想解决问题
图形化编程:根据(问题得的需求)思维导图,UML涉及到的图,直接编码
用户体验友好:提示,数据检验,菜单…
题目
思维导图
知识点
好好理解面向对象,分析完问题,先找对象,把几个有关联的对象抽象成类,模块化思想,分装方法属性
1.IO流
在Java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:
标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。将数据从外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。
标准I/O
Java程序可通过命令行参数与外界进行简短的信息交换,同时,也规定了与标准输入、输出设备,如键盘、显示器进行信息交换的方式。而通过文件可以与外界进行任意数据形式的信息交换。
java自带的标准数据流:java.lang.System:
-
标准输出流 System.out
System.out向标准输出设备输出数据,其数据类型为PrintStream。方法:
Void print( 参数)
Void println( 参数)
-
标准输入流 System.in
System.in读取标准输入设备数据(从标准输入获取数据,一般是键盘),其数 据类型为InputStream。
2.数据存储方式
有5种,大家先了解堆,栈
读取输入并赋值:先存储再读取,底层是存到堆中,new对象给属性赋值,对象间有联系可以进一步把对象放容器中(数组,集合)
顺序访问只访问一次:直接操作数据,底层是存到栈中,本道题不推荐,后期如何读取,其实是考验你的数学
3.对象与数组
Java和C++都是面向对象的语言。在使用这些语言的时候,我们可以直接使用标准的类库,也可以使用组合和继承等面向对象的特性构建自己的类,并且根据自己构建的类创建对象
代码
Main
import java.util.Scanner;
public class Main {
static int n, k, t, xl, yd, xr, yu, passpeo = 0, staypeo = 0,count=0,flag=0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("=====欢迎使用======");
while (true) {
System.out.println("Please Input:n k t xl yd xt yu!");
n = sc.nextInt();
k = sc.nextInt();
t = sc.nextInt();
xl = sc.nextInt();
yd = sc.nextInt();
xr = sc.nextInt();
yu = sc.nextInt();
if (xl >= xr || yd >= yu) {
System.out.println("Error input!Please reinput!");
} else
break;
}
Resident[][] resident = new Resident[n][2 * t];//居民类二维数组,行是编号,列是t个时刻2t个点
for (int i = 0; i < n; i++) {
for (int j = 0; j < t; j++) { //注意内层循环是t,不是2t
resident[i][j] = new Resident();//resident[i][j]是一个居民,第i个,第j时刻,初始化时两个属性x,y为0
resident[i][j].setX(sc.nextInt());
resident[i][j].setY(sc.nextInt());
flag= judge(resident[i][j]);
}
//注意这里判断条件改成了连续累计的flag,不是count
if (flag >= k) { //注意两个if执行顺序,连续k的判断
staypeo++;
passpeo++;
} else if (flag >= 1) {
passpeo++;
}
flag = 0;//count记录居民t个时刻的,flag记录当前进入连续最多的,遍历下一个居民时,注意都要清零
}
System.out.println(passpeo);
System.out.println(staypeo);
}
private static int judge(Resident resident) {
if (xl <= resident.getX() && resident.getX() <= xr && yd <= resident.getY() && resident.getY() <= yu) {
count++;
if (count > flag)
flag = count; // 在高危区域最多连续时刻数
} else {
count = 0;//中间有间断点,count清零
}
return flag;
}
}
Resident
public class Resident {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
问题解决
1.连续k个
思路:使用当前最多连续时刻数flag进行判断,不是计数的count,注意区分两者不同
if (count > flag)
flag = count; // 在高危区域最多连续时刻数
注意,flag和count都要清零
2.双层for
loop:
break loop; 类似于goto,不建议使用
break
语句可以跳出当前循环;通常配合if
,在满足条件时提前结束整个循环;总是跳出最近的一层循环;
小结
- 图形化思想很重要
- 对象&&数组