【POJ】1054 The Troublesome Frog
题目是非常经典的搜索+剪枝。题意简言之就是,青蛙需要沿着直线踩着踏点通过田地,并且踏点需要至少为3。问哪条路径青蛙踩坏的作物最多。很好的一个条件是青蛙每次移动都是等间距的。题目需要注意将其排序。
#include <iostream>
using namespace std; #define MAXNUM 5005 typedef struct {
int x, y;
} point_st; point_st points[MAXNUM];
bool Fields[MAXNUM][MAXNUM];
int r, c, n; int comp(const void *a, const void *b) {
point_st *p1 = (point_st *)a;
point_st *p2 = (point_st *)b;
if (p1->x != p2->x)
return p1->x - p2->x;
else
return p1->y - p2->y;
} int calPath(int p1, int p2) {
int x1 = points[p1].x, y1 = points[p1].y;
int x2 = points[p2].x, y2 = points[p2].y;
int nx, ny, cnt = ; while () {
nx = *x2 - x1;
ny = *y2 - y1;
if (nx> && nx<=r && ny> && ny<=c) { // 保持在田地范围内
if (Fields[nx][ny]) {
cnt++;
x1 = x2; y1 = y2;
x2 = nx; y2 = ny;
} else {
return ; // 前面没有踏点了,即此路不通
}
} else {
if (cnt >= )
return cnt;
else
return ; // 踏点不足3,不符合题意
}
}
} int main() {
int i, j, k;
int a, b; while (cin >>r>>c) {
cin >>n; memset(Fields, false, sizeof(Fields)); for (i=; i<n; ++i) {
cin >>points[i].x>>points[i].y;
Fields[points[i].x][points[i].y] = true;
} qsort(points, n, sizeof(point_st), comp);
int sum = ; for (i=; i<n; ++i) {
for (j=i+; j<n; ++j) {
int dx = points[j].x - points[i].x;
if (dx> && ((r-points[i].x)/dx) < sum) // 剪枝1,当前的可移动点数大于sum(sum为当前最大值)
continue;
int dy = points[j].y - points[i].y;
a = points[i].x - dx;
b = points[i].y - dy;
if (a> && a<=r && b> && b<=c) // 剪枝2,该点的前趋点仍然在图中,则证明points[i]点不能作为初始点
continue;
k = calPath(i, j); if (k > sum)
sum = k;
}
} cout <<sum<<endl;
} return ;
}
【POJ】1054 The Troublesome Frog的更多相关文章
- 【POJ】1704 Georgia and Bob(Staircase Nim)
Description Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, ...
- 【POJ】1067 取石子游戏(博弈论)
Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...
- POJ 1054 The Troublesome Frog
The Troublesome Frog Time Limit: 5000MS Memory Limit: 100000K Total Submissions: 9581 Accepted: 2883 ...
- 【BZOJ】【1986】【USACO 2004 Dec】/【POJ】【2373】划区灌溉
DP/单调队列优化 首先不考虑奶牛的喜欢区间,dp方程当然是比较显然的:$ f[i]=min(f[k])+1,i-2*b \leq k \leq i-2*a $ 当然这里的$i$和$k$都是偶数啦~ ...
- 【POJ】【2104】区间第K大
可持久化线段树 可持久化线段树是一种神奇的数据结构,它跟我们原来常用的线段树不同,它每次更新是不更改原来数据的,而是新开节点,维护它的历史版本,实现“可持久化”.(当然视情况也会有需要修改的时候) 可 ...
- 【POJ】1222 EXTENDED LIGHTS OUT
[算法]高斯消元 [题解] 高斯消元经典题型:异或方程组 poj 1222 高斯消元详解 异或相当于相加后mod2 异或方程组就是把加减消元全部改为异或. 异或性质:00 11为假,01 10为真.与 ...
- 【POJ】2892 Tunnel Warfare
[算法]平衡树(treap) [题解]treap知识见数据结构 在POJ把语言从G++换成C++就过了……??? #include<cstdio> #include<algorith ...
- 【POJ】【1637】Sightseeing tour
网络流/最大流 愚人节快乐XD 这题是给一个混合图(既有有向边又有无向边),让你判断是否有欧拉回路…… 我们知道如果一个[连通]图中每个节点都满足[入度=出度]那么就一定有欧拉回路…… 那么每条边都可 ...
- 【poj】1001
[题目] ExponentiationTime Limit: 500MS Memory Limit: 10000KTotal Submissions: 123707 Accepted: 30202De ...
随机推荐
- java中IO流的操作
读取转换流--读取键盘录入中键盘录入一行数据并打印其大写,发现就是读一行数据的原理.也就是readLine方法.能不能直接使用readLine方法来完成键盘录入一行数据的读取呢?readLine方法是 ...
- html-----017
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- c# DataTable 中 Select 和 Clone 用法结合
C# DataTable是存放数据的一个离线数据库,将数据一下加载到内存. DataTable.Select ()方法: Select();//全部查出来 Select(过滤条件);//根据过滤 ...
- (poj)3020 Antenna Placement 匹配
题目链接 : http://poj.org/problem?id=3020 Description The Global Aerial Research Centre has been allotte ...
- C++ DLL 获取 MSI Property
VS2010 创建 C++, Win32 DLL工程C-TEST. Stdafx.h中,在<windows.h>之后 添加引用. #include <msi.h> #incl ...
- 云盾正常扫描云服务器的IP是什么
问题:云盾正常扫描云服务器的IP是什么? 解答:云盾扫描云服务器的的IP段固定为 42.120.145.0/24 110.75.105.0/24 110.75.185.0/24 110.75 ...
- Android AndroidManifest学习笔记
<application>标签 : android:allowBackup="true" 数据可以备份 <activity>标签:configChanges ...
- 面试题(C#基础)
1>构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading. 2>string[] ss=Enum.GetNames(typeof(C ...
- Cassandra1.2文档学习(7)—— 规划集群部署
数据参考:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- 使用ajaxFileUpload实现异步上传图片
index.html <head runat="server"> <title></title> <script src="jq ...