zoukankan      html  css  js  c++  java
  • 模拟+贪心 SCU 4445 Right turn

    题目传送门

     1 /*
     2     题意;从原点出发,四个方向,碰到一个点向右转,问多少次才能走出,若不能输出-1
     3     模拟:碰到的点横坐标相等或纵坐标相等,然而要先满足碰到点最近,
     4         当没有转向或走到之前走过的点结束循环。dir数组使得代码精简巧妙
     5     对点离原点排序竟然submit failed,别人的代码有毒!
     6 */
     7 #include <cstdio>
     8 #include <cstring>
     9 #include <algorithm>
    10 #include <map>
    11 #include <cmath>
    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             else
    37             {
    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 turn
    56 {
    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
    ", work ());
    66     }
    67 
    68     return 0;
    69 }
    编译人生,运行世界!
  • 相关阅读:
    学好C++必须要注意的十八个问题
    c++设计模式-----抽象工厂模式
    C++设计模式----工厂模式
    c++设计模式----装饰模式
    常用算法(二)—高级算法
    常用算法收集
    修改admin中App的名称与表的名称
    数据分析画图,使用原生sql查询数据
    组合搜索框的实现
    django前端分页小组件
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4644692.html
Copyright © 2011-2022 走看看