博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模拟+贪心 SCU 4445 Right turn
阅读量:5458 次
发布时间:2019-06-15

本文共 1788 字,大约阅读时间需要 5 分钟。

 

1 /* 2     题意;从原点出发,四个方向,碰到一个点向右转,问多少次才能走出,若不能输出-1 3     模拟:碰到的点横坐标相等或纵坐标相等,然而要先满足碰到点最近, 4         当没有转向或走到之前走过的点结束循环。dir数组使得代码精简巧妙 5     对点离原点排序竟然submit failed,别人的代码有毒! 6 */ 7 #include 
8 #include
9 #include
10 #include
11 #include
12 using namespace std;13 14 const int MAXN = 1e3 + 10;15 const int INF = 0x3f3f3f3f;16 int x[MAXN], y[MAXN];17 int dir[4][2] = {
1, 0, 0, -1, -1, 0, 0, 1};18 int n;19 int vis[4][MAXN];20 21 int work(void)22 {23 int nx = 0, ny = 0; int d = 0; int res = 0;24 memset (vis, 0, sizeof (vis));25 26 while (true)27 {28 int mx = INF, p = -1;29 for (int i=1; i<=n; ++i)30 {31 if (d == 0 || d == 2)32 {33 if (ny != y[i]) continue;34 if ((x[i] - nx) * dir[d][0] < 0) continue;35 }36 else37 {38 if (nx != x[i]) continue;39 if ((y[i] - ny) * dir[d][1] < 0) continue;40 }41 42 int tmp = abs (x[i] - nx) + abs (y[i] - ny);43 if (tmp < mx) {mx = tmp; p = i;}44 }45 46 if (p == -1) return res;47 if (vis[d][p]) return -1;48 vis[d][p] = 1;49 nx = x[p] - dir[d][0]; ny = y[p] - dir[d][1];50 d = (d + 1) % 4; res++;51 }52 53 }54 55 int main(void) //SCU 4445 Right turn56 {57 // freopen ("E.in", "r", stdin);58 59 while (scanf ("%d", &n) == 1)60 {61 for (int i=1; i<=n; ++i)62 {63 scanf ("%d%d", &x[i], &y[i]);64 }65 printf ("%d\n", work ());66 }67 68 return 0;69 }

 

转载于:https://www.cnblogs.com/Running-Time/p/4644692.html

你可能感兴趣的文章
MySQL 学习笔记 二
查看>>
Liunx Shell入门
查看>>
C++ 总结
查看>>
poj2593 Max Sequence(两个不相交字段的最大总和与)
查看>>
Mustache 使用心得总结
查看>>
BZOJ 3224: Tyvj 1728 普通平衡树
查看>>
基于PCA的人脸识别步骤
查看>>
perl学习(2) 基本数据类型等
查看>>
组队练习赛(Regionals 2012, North America - East Central NA)
查看>>
libevent源码剖析
查看>>
第24条:将类的实现代码分散到便于管理的数个分类之中
查看>>
LINQ-进行数据转换
查看>>
Yii 事件行为的过程详解(未完待续。。)
查看>>
Solr与MongoDB集成,实时增量索引[转]
查看>>
最长不下降子序列的O(n*logn)算法
查看>>
设计模式(十七)——模板方法模式
查看>>
uva 10954 Add All
查看>>
如何让你的 Asp.Net Web Api 接口,拥抱支持跨域访问。
查看>>
ArcGIS Server 10.1 错误 service failed to start,
查看>>
MYSQL中case when then else end 用法
查看>>