POJ 1054 The Troublesome Frog 枚举
这个题分类是dp,想了一会没有想出来,就去看别人题解了。发现别人题解全是暴力枚举= =。复杂度超过 N^2,但可能是剪枝的作用,没有超时。
思路:将所有点按坐标由小到大排序。两两枚举点p1,p2,并判断其中坐标较小的点p1是否是该路径上青蛙跳至的第一个点(假设在p1之前还有一点,则可以根据p1和p2的距离算出p1前一点的坐标,判断该坐标是否在麦田内,若不在则说明p1是青蛙跳至的第一个点)。判定p1前一点坐标时,我原以为由于所有点的坐标都是排好序的(从小到大),则p1前一点的坐标必然更小,因此判定它是否在麦田内时只需要判断是否坐标都大于0,并不需要判断是否超坐标上限。但这种思路是错误的。见下图。
上图情况中,排好序后两两枚举,则到点2与点3时,p1是点2,p2是点1,则p1的前一点在图中的虚线上,此时明显需要判断该点是否超过麦田的坐标上限。
通过上述判断规则,如果p1不是青蛙跳至的第一个点,则跳过该次枚举(因为它必然包含在某次枚举的情况里)。如果是,则根据p1到p2的坐标变化,判断p2后面所有要跳至的点是否都存在。如果存在,则该次枚举是有效的。记录该路径跳的次数。
最后求所有次数的最大值即可。
下面是代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#define maxn 5005
using namespace std;
struct nod
{
int x, y;
bool operator < (const nod &cmp) const
{
if (x == cmp.x) return y < cmp.y;
return x < cmp.x;
}
}rice[maxn];
bool map[maxn][maxn];
int main()
{
int r, c, n;
//freopen("data.in", "r", stdin);
scanf("%d%d%d",&r,&c,&n);
memset(map, , sizeof(map));
for (int i = ; i < n; i++)
{
scanf("%d%d",&rice[i].x, &rice[i].y);
map[rice[i].x][rice[i].y] = ;
}
sort(rice, rice + n);
int res = ;
for (int i = ; i < n; i++)
for (int j = i + ; j < n; j++) if (i != j)
{
int dx = rice[j].x - rice[i].x;
int dy = rice[j].y - rice[i].y;
if (rice[i].x - dx >= && rice[i].x - dx <= r && rice[i].y - dy >= && rice[i].y - dy <= c) continue;
int nx = rice[j].x + dx;
int ny = rice[j].y + dy;
int len = ;
int ok = ;
while (nx > && nx <= r && ny > && ny <= c && ok)
{
if (map[nx][ny]) len++;
else ok = ;
nx += dx;
ny += dy;
}
if (ok && len > ) res = max(res, len);
}
printf("%d", res);
return ;
}
POJ 1054 The Troublesome Frog 枚举的更多相关文章
- POJ 1054 The Troublesome Frog
The Troublesome Frog Time Limit: 5000MS Memory Limit: 100000K Total Submissions: 9581 Accepted: 2883 ...
- Poj 1054 The Troublesome Frog / OpenJudge 2812 恼人的青蛙
1.链接地址: http://poj.org/problem?id=1054 http://bailian.openjudge.cn/practice/2812 2.题目: 总时间限制: 10000m ...
- POJ 1054 The Troublesome Frog(枚举+剪枝)
题目链接 题意 :给你r*c的一块稻田,每个点都种有水稻,青蛙们晚上会从水稻地里穿过并踩倒,确保青蛙的每次跳跃的长度相同,且路线是直线,给出n个青蛙的脚印点问存在大于等于3的最大青蛙走的连续的脚印个数 ...
- POJ - 1054 The Troublesome Frog 模拟 枚举优化。
题意:有个R*C的格网.上面有若干个点,这些点可以连成一些直线,满足:这些点在直线上均匀排布(也就是间隔相等),直线的两段穿过网格(也就是第一个,最后一个在网格的边界附近) 求某条直线上最多的点数 题 ...
- (中等) POJ 1054 The Troublesome Frog,记忆化搜索。
Description In Korea, the naughtiness of the cheonggaeguri, a small frog, is legendary. This is a we ...
- poj 1054 The Troublesome Frog (暴力搜索 + 剪枝优化)
题目链接 看到分类里是dp,结果想了半天,也没想出来,搜了一下题解,全是暴力! 不过剪枝很重要,下面我的代码 266ms. 题意: 在一个矩阵方格里面,青蛙在里面跳,但是青蛙每一步都是等长的跳, 从一 ...
- 【POJ】1054 The Troublesome Frog
题目是非常经典的搜索+剪枝.题意简言之就是,青蛙需要沿着直线踩着踏点通过田地,并且踏点需要至少为3.问哪条路径青蛙踩坏的作物最多.很好的一个条件是青蛙每次移动都是等间距的.题目需要注意将其排序. #i ...
- POJ1054 The Troublesome Frog
题目来源:http://poj.org/problem?id=1054 题目大意: 有一种青蛙在晚上经过一片稻田,在庄稼上跳跃,会把庄稼压弯.这让农民很苦恼.我们希望通过分析青蛙跳跃的路径,找出对稻田 ...
- POJ 1161 Walls(最短路+枚举)
POJ 1161 Walls(最短路+枚举) 题目背景 题目大意:题意是说有 n个小镇,他们两两之间可能存在一些墙(不是每两个都有),把整个二维平面分成多个区域,当然这些区域都是一些封闭的多边形(除了 ...
随机推荐
- 如何在Linux下使用Rsync
如何在Linux下使用Rsync 吐槽 昨天对scp进行总结之后看到最后有说到Rsync,俗语有云:好奇心害死猫.抱着学习的态度将Rsync给找了出来,然后进行了一些简单的学习.下面介绍一些个常用的命 ...
- gym101532 2017 JUST Programming Contest 4.0
台州学院ICPC赛前训练5 人生第一次ak,而且ak得还蛮快的,感谢队友带我飞 A 直接用claris的模板啊,他模板确实比较强大,其实就是因为更新的很快 #include<bits/stdc+ ...
- linux基础(基本命令)
Linux学习 1.Linux安装.配置 Linux的操作背景介绍 Linux操作系统 开源.自由且开发源代码的类Unix操作系统 厂商较多 著名的有R ...
- ruby 发送邮件
产品构建.打包.部署完需要发送邮件通知相关人员进行验证.请看过程 #encoding:utf-8 require 'mail' #~ branch = ARGV.to_s.sub('[','').su ...
- Vue2.0 - 生命周期
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- Zabbix整合MegaCLI实现物理硬盘的自动发现和监控
MegaCLI是LSI提供的用户空间管理RAID卡(LSI芯片)工具,适用于大多数的Dell服务器. MegaCLI介绍: http://zh.community.dell.com/techcente ...
- Spring Boot是什么
Spring Boot是什么 我们知道,从 2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE(Java Enterprise Edition)开发中真正意义上的标准,但 ...
- windows系统——U 盘损坏修复
u盘损坏怎么修复 1.打开控制面板——管理工具——计算机管理——存储——磁盘管理——右击“磁盘1”——点击“初始化磁盘”——“确定”——初始化完毕后,U盘为“联机”状态. 2.在右边空白处“新建磁盘分 ...
- bzoj2553【beijing2011】禁忌
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2553 sol :puts("nan"); (逃~ ac自动机+矩阵快速幂 ...
- JavaScript 的新特性:类的 #private 字段
这是什么,如何使用,为什么需要? 一边听“Noise Pollution” —— Portugal. The Man,一边阅读本文简直就是享受 JavaScript 标准的第二阶段(Stage 2)加 ...