leetcode 587. Erect the Fence 围栏最短 + 凸包优化
来源:互联网 发布:淘宝达人申请理由简述 编辑:程序博客网 时间:2024/05/09 17:48
There are some trees, where each tree is represented by (x,y) coordinate in a two-dimensional garden. Your job is to fence the entire garden using the minimum length of rope as it is expensive. The garden is well fenced only if all the trees are enclosed. Your task is to help find the coordinates of trees which are exactly located on the fence perimeter.
Example 1:
Input: [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]]
Output: [[1,1],[2,0],[4,2],[3,3],[2,4]]
Explanation:
Example 2:
Input: [[1,2],[2,2],[4,2]]
Output: [[1,2],[2,2],[4,2]]
Explanation:
Even you only have trees in a line, you need to use rope to enclose them.
Note:
All trees should be enclosed together. You cannot cut the rope to enclose trees that will separate them in more than one group.
All input integers will range from 0 to 100.
The garden has at least one tree.
All coordinates are distinct.
Input points have NO order. No order required for output.
本题题意很简单,就是寻找一个凸多边形来找到包含所有节点的,这个是经典的问题,这个是参考这个教程的做法[LeetCode] Erect the Fence 竖立栅栏
代码如下:
#include <iostream>#include <vector>#include <map>#include <set>#include <queue>#include <stack>#include <string>#include <climits>#include <algorithm>#include <sstream>#include <functional>#include <bitset>#include <numeric>#include <cmath>using namespace std;/*struct Point { int x; int y; Point() : x(0), y(0) {} Point(int a, int b) : x(a), y(b) {}};*/class Solution{public: vector<Point> outerTrees(vector<Point>& points) { vector<Point> res; Point first = points[0]; int firstIdx = 0, n = points.size(); for (int i = 1; i < n; ++i) { if (points[i].x < first.x) { first = points[i]; firstIdx = i; } } res.push_back(first); Point cur = first; int curIdx = firstIdx; while (true) { Point next = points[0]; int nextIdx = 0; for (int i = 1; i < n; ++i) { if (i == curIdx) continue; int cross = crossProduct(cur, points[i], next); if (nextIdx == curIdx || cross > 0 || (cross == 0 && dist(points[i], cur) > dist(next, cur))) { next = points[i]; nextIdx = i; } } for (int i = 0; i < n; ++i) { if (i == curIdx) continue; int cross = crossProduct(cur, points[i], next); if (cross == 0) { if (check(res, points[i])) res.push_back(points[i]); } } cur = next; curIdx = nextIdx; if (curIdx == firstIdx) break; } return res; } int crossProduct(Point A, Point B, Point C) { int BAx = A.x - B.x; int BAy = A.y - B.y; int BCx = C.x - B.x; int BCy = C.y - B.y; return BAx * BCy - BAy * BCx; } int dist(Point A, Point B) { return (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y); } bool check(vector<Point>& res, Point p) { for (Point r : res) { if (r.x == p.x && r.y == p.y) return false; } return true; }};
- leetcode 587. Erect the Fence 围栏最短 + 凸包优化
- leetcode_587.Erect the Fence?待解决
- light1239 - Convex Fence【凸包】
- Building Fence hdu 凸包
- Dijkstra 最短路径 优化
- [USACO Dec08]巨大的围栏Largest Fence解题报告
- Bzoj1591:[Usaco2008 Dec]Largest Fence 最大的围栏:DP
- HDU4667 Building Fence(凸包)
- 最短路径(Python)networkx 包
- 最短路径之 Dijkstra的优化
- Dijkstra最短路径算法的优化
- Leetcode Shortest Palindrome (最短回文串)
- [LeetCode] Shortest Palindrome 最短回文串
- find the longest of the shortest 最短路径 dijkstra
- 墙头草 on the fence
- acm-Color the fence
- 791 Color the fence
- nyoj color the fence
- 通过system.currentTimeMillis() 获得当前的时间
- 互联网架构如何实现“高并发”
- IDEA web项目配置文件错误问题
- leetCode_2
- 快速排序
- leetcode 587. Erect the Fence 围栏最短 + 凸包优化
- 详解Android7.0及以上版本拍照或者相册选取照片包括裁剪照片时时App崩溃问题
- 公众号门店管理,上传图片到微信门店
- 尺寸位置操作
- C#真的过时了吗?
- myclipse编译mysql语句中文问题
- Qt开发-简易浏览器+无边框阴影可移动可拖动窗口代码分享
- php利用ob_start()清除输出和选择性输出
- java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportant