OpenJudge - 2812:恼人的青蛙

目录

1、题目

2、题目解读、

3、代码

1、题目

输入

从标准输入设备上读入数据。第一行上两个整数R、C,分别表示稻田中水稻的行数和列数,1≤R、C≤5000。第二行是一个整数N,表示被踩踏的水稻数量, 3≤N≤5000。在剩下的N行中,每行有两个整数,分别是一颗被踩踏水稻的行号(1~R)和列号(1~C),两个整数用一个空格隔开。而且,每棵被踩踏水稻只被列出一次。

输出

从标准输出设备上输出一个整数。如果在稻田中存在青蛙行走路径,则输出包含最多水稻的青蛙行走路径中的水稻数量,否则输出0。

样例输入

6 7
14
2 1
6 6
4 2
2 5
2 6
2 7
3 4
6 1
6 2
2 3
6 3
6 4
6 5
6 7 

样例输出

7

2、题目解读

因为要求出最长的路径,所有需要比较全部的路径长度。对于每一条路径,因为步长相等,所有只要确定开始两个被踩的的点就可以求出整条路径。假设前两个点为(x₁,y₁),(x₂,y₂),则步长为dx=x₂-x₁,dy=y₂-y₁,需要判断下面三个条件是否都满足。

(1)、之后每个点(xᵢ,yᵢ)=(xᵢ₋₁+dx,yᵢ₋₁+dy)=(x₂+(i-2)*dx,y₂+(i-2)*dy),需要依次判断各个点是否被踩过。

(2)、(x₁-dx,y₁-dy)需要在稻田之外,因为这样才能保证这个(x₁,y₁)这个点是这条最长直线的第一个点,或者是这样才能保证这可能是最长的一条直线。

(3)、将路径上的最后一颗水稻记作(xⱼ,yⱼ),则(xⱼ+dx,yⱼ+dy)需要在稻田之外。这才能保证最后一个点为稻田的边界。

boolean[][] flag:用来判断是否被青蛙踩过,true表示被踩过,false表示未被踩过

Point[] p:用来记录稻田被踩的点的坐标

题目还要求每条青蛙的行走路径上面至少有三个被踩的点(水稻)否则输出0.

然后就是进行编码,来一一枚举各条直线是否为最长的被踩的直线。

3、代码

import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;public class 恼人的青蛙 {public static int MAX=5010;//水稻长宽最长为5000public static int r,c,n,ans=0;public static boolean[][] flag=new boolean[MAX][MAX];//用来判断是否被青蛙踩过,true表示被踩过,false表示未被踩过public static Point[] p;//用来记录稻田被踩的点的坐标static boolean Outside(int x1,int y1){//判断是否在农田外true表示在稻田外,false表示在稻田内return x1 <= 0 || y1 <= 0 || x1 > r || y1 > c;}//判断以a和b为起点的路径是否存在static boolean count(int a,int b){int dx=p[b].x-p[a].x;//计算dxint dy=p[b].y-p[a].y;//计算dy//优化条件一:如果不能从稻田外跳到a点,则直接退出if (!Outside(p[a].x-dx,p[a].y-dy))return false;//优化条件二:如果青蛙经过MAXSTEPS-1步就会跳出去,那么直接退出if (p[a].x+ans*dx<=0||p[a].x+ans*dx>r) return false;if (p[a].y+ans*dy<=0||p[a].y+ans*dy>c) return false;int k=2;int x1=p[b].x+dx;int y1=p[b].y+dy;//按照步长将路延伸,并且判断是否被踩而且没有超出稻田的范围while (!Outside(x1,y1)&&flag[x1][y1]){k++;x1+=dx;y1+=dy;}//判断是否可以跳出,因为最后一个点应该在稻田外面if (Outside(x1,y1)&&k>ans)ans=k;return true;}public static void main(String[] args) throws IOException {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String[] input1=bf.readLine().split(" ");r=Integer.parseInt(input1[0]);c=Integer.parseInt(input1[1]);n=Integer.parseInt(bf.readLine().trim());//加trim 是因为输入时后面会带一个空格,否则无法转换成整数p=new Point[n];//n行输入,表示n个被青蛙踩踏的点for (int i=0;i<n;i++){String[] input2=bf.readLine().split(" ");p[i]=new Point();p[i].x=Integer.parseInt(input2[0]);p[i].y=Integer.parseInt(input2[1]);flag[p[i].x][p[i].y]=true;}//重写sort排序,先比较点的x,再比较yArrays.sort(p, new Comparator<Point>() {@Overridepublic int compare(Point o1, Point o2) {if (o1.x==o2.x)return o1.y-o2.y;elsereturn o1.x-o2.x;}});//或者使用lambda表达式来重写比较方法/*Arrays.sort(p, (o1, o2) -> {if (o1.x==o2.x)return o1.y-o2.y;elsereturn o1.x-o2.x;});*///枚举所有点,一一进行判断for (int i=0;i<n;i++)for (int j=i+1;j<n;j++){count(i,j);}if (ans<3)ans=0;System.out.println(ans);}
}

刷题之恼人的青蛙java(百练2812)相关推荐

  1. 【牛客网刷题】中秋节前开启java专项练习错题总结第一天

    [牛客网刷题]中秋节前开启java专项练习错题总结第一天 概述 写在前面 错题分析 值得记录的错题 总结 写在最后 概述 还有十几天就到中秋节了,从此又老了一岁,也多了一年的知识积累.对于这样一个特殊 ...

  2. 刷题、面试必备网站(java)

    https://blog.csdn.net/qq_39597203/article/details/87040973 整理的一些刷题面试的网站,做一个汇总,分久必合 一. 思维训练 逻辑思维训练500 ...

  3. 编程刷题平台Codewars初体验-Java

    点此欢迎光临我的个人网站[一几文星球] 最近发现了一个很多网友都在推荐的编程刷题平台Codewars,作为一个对啥都好奇(啥都学不深 )的编程菜鸟,我二话不说直接开始注册体验. 网站一进,嘿,全英文, ...

  4. 2023基于微信小程序的刷题考试系统(springboot+mysql)-JAVA.VUE(论文+开题报告+运行)

    摘 要 随着科技和网络的进步,计算机技术与网络.生活贴和的更加紧密.需要依靠客户端的单机系统逐渐被淘汰,利用互联网可以处理大量数据的新型系统如雨后春笋般迅速发展起来.这类系统和信息化时代的同步发展对传 ...

  5. 2018/12/05 PAT刷题 L1-018 大笨钟 Java

    花了很大的力气把题目从Scanner的输入方式改成BufferedReader和InputStreamReader的方式, 想法其实是很简单的, 就是执行的过程中, 不仔细, 导致有1个测试点一直过不 ...

  6. 【leetcode刷题】36.提莫攻击——Java版

    ⭐欢迎订阅<leetcode>专栏,每日一题,每天进步⭐ 我建议加上攻速,攻击力,生命回复速率,护甲,魔抗,血量,计算在攻击频率下提莫几秒弄死艾希 --leetcode此题热评 前言 哈喽 ...

  7. [LeetCode刷题] 2611. 老鼠和奶酪--Java实现

    ##  题目链接 2611. 老鼠和奶酪 - 力扣(LeetCode) ##  题目描述 有两只老鼠和 n 块不同类型的奶酪,每块奶酪都只能被其中一只老鼠吃掉. 下标为 i 处的奶酪被吃掉的得分为: ...

  8. 【leetcode刷题】16.环形链表——Java版

    ⭐欢迎订阅<leetcode>专栏,每日一题,每天进步⭐ 使用快慢指针,若指针相遇则判断有环 --leetcode此题热评 前言 哈喽,大家好,我是一条. 糊涂算法,难得糊涂 Questi ...

  9. 刷题记录7.20 青蛙们跳台阶

    剑指 Offer 46. 把数字翻译成字符串. 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如 ...

最新文章

  1. [数据结构与算法]平衡二叉树实现
  2. 一些常规形几何形状的绘制和效果填充(二)
  3. 计算机二级如何接受审阅者修订,操作方法 合并修订文档 步骤1 要求审阅者
  4. 详解CentOS7安装配置vsftp搭建FTP
  5. 【BZOJ3156】防御准备,斜率优化DP
  6. Visual C# 打造 “浏览器”
  7. Linux截图工具import使用说明
  8. 数据结构——>线索化二叉树
  9. UI设计师的7大能力模型
  10. 俄罗斯方块Tetris(C基础,Linux终端)
  11. Unity面试经验(两天面六家,四个offer,济南)
  12. 购买亚马逊保险前,卖家须注意的问题值得你收藏!
  13. 宽带信号的DOA估计学习笔记(四):空间分辨率
  14. mantis问题状态
  15. ABB机器人基本知识。
  16. Java实现 蓝桥杯VIP 算法提高 阮小二买彩票
  17. 机器人学基础--运动学--2.3 变换矩阵
  18. AI将带我们去何方?(上-前言篇)
  19. 转义符——反斜杠(\)
  20. 2022便利蜂4.14算法笔试题

热门文章

  1. 软件测试文档结课论文,软件测试课程论文设计报告.docx
  2. iMindMap该怎样用来画思维导图
  3. C++ 类继承:构造函数与析构函数调用顺序,派生类和基类之间的特殊关系,公有继承及其他
  4. 如何正确使用qrcode生成二维码
  5. VSCode vue : 无法加载文件 C:\Users\XXX\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本
  6. 如何使您的咖啡壶自动化
  7. (开源kkFileView、kkOffice)在线预览word、pdf、ofd、excel、ppt、压缩包、图片等等
  8. GBase 8s时间限制版本更换为正式版本操作
  9. 与其做痛苦的房奴,不如做个快乐的租房族
  10. 数字化时代-8:从三次社会大分工中看一部分人先富起来