Space Ant
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 2876   Accepted: 1839

Description

The most exciting space discovery occurred at the end of the 20th century. In 1999, scientists traced down an ant-like creature in the planet Y1999 and called it M11. It has only one eye on the left side of its head and just three feet all on the right side of its body and suffers from three walking limitations: 
  1. It can not turn right due to its special body structure.
  2. It leaves a red path while walking.
  3. It hates to pass over a previously red colored path, and never does that.

The pictures transmitted by the Discovery space ship depicts that plants in the Y1999 grow in special points on the planet. Analysis of several thousands of the pictures have resulted in discovering a magic coordinate system governing the grow points of the plants. In this coordinate system with x and y axes, no two plants share the same x or y
An M11 needs to eat exactly one plant in each day to stay alive. When it eats one plant, it remains there for the rest of the day with no move. Next day, it looks for another plant to go there and eat it. If it can not reach any other plant it dies by the end of the day. Notice that it can reach a plant in any distance. 
The problem is to find a path for an M11 to let it live longest. 
Input is a set of (x, y) coordinates of plants. Suppose A with the coordinates (xA, yA) is the plant with the least y-coordinate. M11 starts from point (0,yA) heading towards plant A. Notice that the solution path should not cross itself and all of the turns should be counter-clockwise. Also note that the solution may visit more than two plants located on a same straight line. 

Input

The first line of the input is M, the number of test cases to be solved (1 <= M <= 10). For each test case, the first line is N, the number of plants in that test case (1 <= N <= 50), followed by N lines for each plant data. Each plant data consists of three integers: the first number is the unique plant index (1..N), followed by two positive integers x and y representing the coordinates of the plant. Plants are sorted by the increasing order on their indices in the input file. Suppose that the values of coordinates are at most 100.

Output

Output should have one separate line for the solution of each test case. A solution is the number of plants on the solution path, followed by the indices of visiting plants in the path in the order of their visits.

Sample Input

2
10
1 4 5
2 9 8
3 5 9
4 1 7
5 3 2
6 6 3
7 10 10
8 8 1
9 2 4
10 7 6
14
1 6 11
2 11 9
3 8 7
4 12 8
5 9 20
6 3 2
7 1 6
8 2 13
9 15 1
10 14 17
11 13 19
12 5 18
13 7 3
14 10 16

Sample Output

10 8 7 3 4 9 5 6 2 1 10
14 9 10 11 5 12 8 7 6 13 4 14 1 3 2

Source

 
  计算几何,凸包的变种,叉积的应用,极角排序
  题意是给你n个点,一只蚂蚁要从y坐标最小的那个点开始,逆时针依次走过所有的点,要求不能走之前走过的点,蚂蚁只能逆时针前进。
  思路:由题意可知,蚂蚁就是走了一个螺旋状的路径,由于只能走逆时针,所以每次选择点的时候,就从剩下的点中选择最靠右的点(叉积比较),以此类推,到最后就能选择出所有的点。
  代码
 #include <iostream>
using namespace std;
#define eps 1e-10
struct Point{ //定义点
double x,y;
Point(double x=,double y=):x(x),y(y) {}
};
typedef Point Vector; //重定义向量
Vector operator + (Vector a,Vector b) //向量+向量
{
return Vector(a.x+b.x,a.y+b.y);
}
Vector operator - (Point a,Point b) //点-点 = 向量
{
return Vector(a.x-b.x,a.y-b.y);
}
double Cross(Vector a,Vector b) //求叉积
{
return a.x*b.y-b.x*a.y;
}
int main()
{
int T;
cin>>T;
while(T--){
int n,i;
Point p[];
bool isw[] = {}; //记录走没走过
cin>>n;
for(i=;i<=n;i++){ //输入点集
int t;
cin>>t;
cin>>p[t].x>>p[t].y;
}
//找出y坐标最小的那个点
double yMin=p[].y;
int num = ;
for(i=;i<=n;i++){
if(p[i].y < yMin){
yMin = p[i].y;
num = i;
}
}
//构成凸包
int pl[]; //存储结果
int j;
pl[] = num;
isw[pl[]] = true;
for(i=;i<n;i++){
for(j=;j<=n;j++) //选择一个没走过的点
if(!isw[j])
break;
pl[i+] = j;
for(j=;j<=n;j++){ //选择最右边的点
if(pl[i+]==j || isw[j])
continue;
if(Cross(p[j] - p[pl[i]],p[pl[i+]] - p[pl[i]])>)
pl[i+] = j;
}
isw[pl[i+]] = true;
}
cout<<n<<' ';
for(i=;i<=n;i++)
cout<<pl[i]<<' ';
cout<<endl;
}
return ;
}

Freecode : www.cnblogs.com/yym2013

poj 1696:Space Ant(计算几何,凸包变种,极角排序)的更多相关文章

  1. 2018.07.04 POJ 1696 Space Ant(凸包卷包裹)

    Space Ant Time Limit: 1000MS Memory Limit: 10000K Description The most exciting space discovery occu ...

  2. POJ 1696 Space Ant(凸包变形)

    Description The most exciting space discovery occurred at the end of the 20th century. In 1999, scie ...

  3. poj 1696 Space Ant (极角排序)

    链接:http://poj.org/problem?id=1696 Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

  4. POJ 1696 - Space Ant 凸包的变形

    Technorati Tags: POJ,计算几何,凸包 初学计算几何,引入polygon后的第一个挑战--凸包 此题可用凸包算法做,只要把压入凸包的点从原集合中排除即可,最终形成图形为螺旋线. 关于 ...

  5. POJ 1696 Space Ant(极角排序)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2489   Accepted: 1567 Descrip ...

  6. POJ 1696 Space Ant 【极角排序】

    题意:平面上有n个点,一只蚂蚁从最左下角的点出发,只能往逆时针方向走,走过的路线不能交叉,问最多能经过多少个点. 思路:每次都尽量往最外边走,每选取一个点后对剩余的点进行极角排序.(n个点必定能走完, ...

  7. POJ 1696 Space Ant 卷包裹法

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3316   Accepted: 2118 Descrip ...

  8. poj 1696 Space Ant(模拟+叉积)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3840   Accepted: 2397 Descrip ...

  9. POJ 1696 Space Ant(点积的应用)

    Space Ant 大意:有一仅仅蚂蚁,每次都仅仅向当前方向的左边走,问蚂蚁走遍全部的点的顺序输出.開始的点是纵坐标最小的那个点,開始的方向是開始点的x轴正方向. 思路:从開始点開始,每次找剩下的点中 ...

随机推荐

  1. [Swift A] - Using Swift with Cocoa and Objective-C--Mix and Match

    Swift与Objective-C的兼容能力允许你在同一个工程中同时使用两种语言.你可以用这种叫做“mix and match”的特性来开发基于混合语言的应用.使用Swfit的最新特性--“mix a ...

  2. nodejs升级

    命令如下: sudo npm install n -g 然后就可以使用n命令: sudo n 0.12.2 这个命令是将nodejs升级到0.12.2版本. sudo n stable 这个命令是升级 ...

  3. 【翻译】Android多线程下安全访问数据库

    为了记录如何线程安全地访问你的Android数据库实例,我写下了这篇小小札记.文章中引用的项目代码请点击这里       假设你已编写了自己的 SQLiteOpenHelper. publicclas ...

  4. django 错误信息

    一.No module named 'requests' 安装: pip install django-salmonella 二.No module named 'requests' 安装: pip ...

  5. miniui前端绑定枚举值

    <script type="text/javascript"> var ConvertData = { DeliveryWays: function (e, cycle ...

  6. jdbc链接基础

    1 jdbc 链接两种方式,通过jdbc链接mysql数据库,url:jdbc:mysql://ip:端口[/database name] 通过什么驱动器,链接什么数据库,数据库的ip,连接端口,可以 ...

  7. drawer navigation, tabhostFragment 默认导向

    问题: 项目结构,在一个抽屉导航中的第一个抽屉中加入了一个tabHostFragment,每次进入项目都是在抽屉导航的默认界面,须要把抽屉划出来再选择某个抽屉. 可是想让APP直接跳转到第一个抽屉界面 ...

  8. DB2中如何取得随机数

    转自:http://blog.csdn.net/jionghan3855/article/details/2246738 在DB2数据库自定义产生指定位数的随机数函数. DB2产生随机数的函数:RAN ...

  9. jquery 修改 bootstrap模态框的宽度并且居中

    1.定义模态框 <div class="modal fade" id="Project_Cell_Modal" tabindex="-1&quo ...

  10. 记一次线上MySQL数据库死锁问题

            最近线上项目报了一个MySQL死锁(DealLock)错误,虽说对业务上是没有什么影响的,由于自己对数据库锁这块了解不是很多,之前也没怎么的在线上碰到过.这次刚好遇到了,便在此记录一下 ...