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. FreeType简介及在vs2010的编译使用
  2. 从编程小白到全栈开发:基于框架开发服务端
  3. Elasticsearch原理与调优
  4. Eclipse 全部快捷一览表(具TM全)
  5. 【C++基础】自定义异常类与多重捕获
  6. C++ 多态在异常中的使用
  7. 计算机组装与维护模拟测试题三答案,春季高考信息技术模拟题3(计算机组装与维修部分含答案)...
  8. 【MySQL】MySQL 两种排序算法
  9. linux中查看某个进程打开的文件数
  10. java21天打卡-day2
  11. CondenseNet: An Efficient DenseNet using Learned Group Convolutions
  12. Leetcode:Longest Substring Without Repeating Characters分析和实现
  13. python游戏编程讲解之凯撒密码
  14. 《计算机世界》封面报道:互联网10年孤独[z]
  15. 基于vue开发的多条件联动筛选特效(类似京东/淘宝/中国移动)
  16. 阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
  17. 终极WordPress页面构建器:WPBakery
  18. [暑假的bzoj刷水记录]
  19. Flink部署 完整使用 (第三章)
  20. 文字细化算法matlab,细化算法matlab

热门文章

  1. Qt HTML JS 实现QQ TIM气泡聊天效果
  2. 【谦杯Linux】Log4j2漏洞突现,感觉啥项目都要升级了,惨
  3. java计算机毕业设计飞机航班信息查询系统MyBatis+系统+LW文档+源码+调试部署
  4. 诺基亚引领新一代5G技术布局物联网
  5. 看懂自适应模糊神经网络(ANFIS)并附ANFIS代码
  6. 第二十四次发博不知道用什么标题好
  7. 直流电机闭环PID控制
  8. 索尼战略转型:合作中求发展
  9. 翻牌游戏如何打乱牌面java_家长专栏提高儿童记忆力的游戏训练
  10. Mac如何快速打开library(资源库文件夹)