水果忍者(数学 叉积)
水果忍者
题目
2010年风靡全球的“水果忍者”游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以完成游戏规定的任务。如果玩家可以一刀砍下画面当中一连串的水果,则会有额外的奖励,如图1所示。
图 1
现在假如你是“水果忍者”游戏的玩家,你要做的一件事情就是,将画面当中的水果一刀砍下。这个问题看上去有些复杂,让我们把问题简化一些。我们将游戏世界想象成一个二维的平面。游戏当中的每个水果被简化成一条一条的垂直于水平线的竖直线段。而一刀砍下我们也仅考虑成能否找到一条直线,使之可以穿过所有代表水果的线段。
图 2
如图2所示,其中绿色的垂直线段表示的就是一个一个的水果;灰色的虚线即表示穿过所有线段的某一条直线。可以从上图当中看出,对于这样一组线段的排列,我们是可以找到一刀切开所有水果的方案的。
另外,我们约定,如果某条直线恰好穿过了线段的端点也表示它砍中了这个线段所表示的水果。假如你是这样一个功能的开发者,你要如何来找到一条穿过它们的直线呢?
输入格式:
输入在第一行给出一个正整数N(≤104),表示水果的个数。随后N行,每行给出三个整数 x、y1、y2,其间以空格分隔,表示一条端点为 (x, y1) 和 (x, y2) 的水果,其中 y1 > y2。
注意:给出的水果输入集合一定存在一条可以将其全部穿过的直线,不需考虑不存在的情况。坐标为区间 [−106, 106) 内的整数。
输出格式:
在一行中输出穿过所有线段的直线上具有整数坐标的任意两点 p
1(x1, y1) 和 p2(x2, y2),格式为 x1 y1 x2 y2。
注意:本题答案不唯一,由特殊裁判程序判定,但一定存在四个坐标全是整数的解。
输入样例:
5
-30 -52 -84
38 22 -49
-99 -22 -99
48 59 -18
-36 -50 -72
输出样例:
-99 -99 -30 -52
代码实现
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>#define inf 0x7fffffff
#define ll long long
using namespace std;
const int maxn = 1e4 + 10;
int n;
struct node {int x, y1, y2;
} fruits[maxn];struct node2 {int x, y;node2() : x(), y() {}node2(int x, int y) : x(x), y(y) {}};int cmp(node a, node b) {return a.x < b.x;
}ll X(node2 a, node2 b) {return 1ll * a.x * b.y - 1ll * a.y * b.x;
}int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> fruits[i].x >> fruits[i].y1 >> fruits[i].y2;}sort(fruits + 1, fruits + n + 1, cmp);for (int i = 1; i <= n; i++) {node2 t1 = node2(0, -1);node2 t2 = node2(0, 1);node2 tp;for (int j = 1; j <= i; j++) {// 寻找斜率最大的下凸tp = node2(fruits[i].x - fruits[j].x, fruits[i].y2 - fruits[j].y1);if (X(t1, tp) > 0) {t1 = tp;}// 寻找斜率最小的上凸tp = node2(fruits[i].x - fruits[j].x, fruits[i].y2 - fruits[j].y2);if (X(t2, tp) < 0) {t2 = tp;}}for (int j = i + 1; j <= n; j++) {// 寻找斜率最大的下凸tp = node2(fruits[j].x - fruits[i].x, fruits[j].y2 - fruits[i].y2);if (X(t1, tp) > 0) {t1 = tp;}// 寻找斜率最小的上凸tp = node2(fruits[j].x - fruits[i].x, fruits[j].y1 - fruits[i].y2);if (X(t2, tp) < 0) {t2 = tp;}}if (X(t1, t2) >= 0) {printf("%d %d %d %d\n", fruits[i].x, fruits[i].y2, fruits[i].x + t2.x, fruits[i].y2 + t2.y);break;}}return 0;
}
水果忍者(数学 叉积)相关推荐
- Fruit Ninja(水果忍者)游戏源代码下载、分析(上)---可运行Android,Ios,Window,Mac,Html5平台
背景: 本来打算下一个游戏是涂鸦跳跃的,因为图片资源没准备好,暂时往后推迟.刚好笔者手头上有部分水果忍者的游戏素材,于是上周末花了一些时间把水果忍者实现了:以前读大学的时候这款游戏就风靡大街小巷,记得 ...
- [unity3d]水果忍者-界面搭建
今天开始用Unity3D做一下水果忍者的游戏,Keep study very day! 效果图: 实现步骤: 1.贴图的创建 , 这里的Pixel Inset中X,Y,Width,Height是贴图的 ...
- 2017级C语言大作业 - 水果忍者
水果忍者 C语言作业 分享17级同学大一上学期用C语言实现的水果忍者.分步骤代码.图片音乐素材.可执行程序可从百度网盘下载: 链接:https://pan.baidu.com/s/1i-e_MVChl ...
- L3-012 水果忍者 (30 分)-PAT 团体程序设计天梯赛 GPLT
2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以 ...
- 【CCCC】L3-012 水果忍者 (30分),,枚举斜率
problem L3-012 水果忍者 (30分) 2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与 ...
- 7-45 水果忍者 (30 point(s))
2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与炸弹,玩家尽可能砍掉所有的水果而避免砍中炸弹,就可以 ...
- 2013年10月i--q手机下载游戏水果忍者
据悉,草案新增和修改的条目共68条,可概括为12个方面的增加.8个方面的完善.其中,进一步强化法律责任,加大对违法行为的惩处力度成为本次修改的一个重点.具体体现在法条中,则有引入"黑名单&q ...
- 全新设计 水果忍者-穿靴子的猫官方中文版首发
2011年底一部动画片吸引了广大爱猫人士的眼球,那就是梦工厂推出的<穿靴子的猫>,这只桀骜不驯的猫咪在征服影视界的同时也成功进军游戏界,为众多手机游戏迷们带来了精彩刺激的最新游戏--< ...
- c语言编程水果忍者,少儿创意编程scratch初级游戏之一水果忍者
可爱的小朋友们,可能你们都有玩过手机版的"水果忍者"游戏哦,不管答案是有还是没有玩过,那么你们觉得你可以编出这样子的游戏吗?今天小编姐姐很自信地告诉你哦,你也可以编出这么好玩的游戏 ...
最新文章
- vs2015 ctrl 单击 转到定义
- C++ Primer 第10章 习题10.23
- ES6--函数的扩展
- 第四周实践项目2 算法库——单链表
- GPUImage实现水印
- 神经网络学习小记录53——TF2搭建孪生神经网络(Siamese network)比较图片相似性
- IIS提示您未被授权查看该页 401.1解决办法
- 不是水文 ,没有人这样教过 Spring Security 和 OAuth 2.0
- Linux 命令(179)—— nice 命令
- 链路聚合-负载分担方式
- strchr()和strrchr()
- linux开机自启jar包
- IT软件工程师求职记,有点启发吧
- java实现老鼠出迷宫
- SHU1757 村村通工程(Floyd算法)
- 试总结计算机整机组装的方法和流程,项目9 组装计算机整机.ppt
- 超大型Oracle数据库设计实例
- 浪潮物理服务器装centos7.9系统
- CSS # 通过CSS使图片颜色反转
- Arduino-nano 指纹门锁