zoukankan      html  css  js  c++  java
  • ZOL 3977. Pointers

      太久没有做 zoj,对 oj 来说,由于它高度的”黑盒性“(输入数据和答案完全保密),保护自信心是非常重要的。所以我先选择一道非常简单的题目刷起。本题目是一个相当简单的题目,难度系数和求 A+B 相当。

      本题,已知一个指针,初始状态指向 N(北),现在对指针做一系列顺时针(C)或者逆时针(A)旋转 90 度的操作,问指针然后指向哪个方向。

      由于四个方向形成一个循环,所以很自然的提示出,把四个方向所在的”圆环“展开成一个数组,所有的旋转操作实际上是移动数组内的索引,对索引进行递增或者递减的操作。然后对索引进行对数组长度的 MOD (取余)操作,限制在合理范围内即可。

      设索引值为 x,初始值为 0,定义向逆时针方向旋转定义为正方向,则:

      逆时针(A)旋转 90 度:x = ( x + 1 )  % 4;

      顺时针(C)选择 90 度:x = ( x - 1 + 4 ) % 4 = ( x + 3 ) % 4;

      因此,我们需要把旋转方向(A 或 C),映射到对 x 的递增值(1 或 3 )上。因此我们发现这里有一个巧合:A 和 C 之间的差值(C - A = 2),恰好也是这个递增值之间的差值( 3 - 1 = 2)。所以这个映射关系,不需要使用条件判断,可以直接写出此映射关系:

      x = ( x + *p - 'A' + 1 ) % 4; ( *p = 'A' 或 'C' )

      如果我们进一步查阅一下 ASCII 码表,上面的代码也等效于:

      x = ( x + *p - '@' ) % 4; 或者  x = ( x + *p - 0x40 ) % 4;

      最终代码如下:

    #include <stdio.h>
    int main(int argc, char* argv[])
    {
        int i, x, count = 0;
        char *p;
        char directions[8] = "NWSE";
        char line[128];
        scanf("%d
    ", &count);
        for(i = 0; i < count; i++)
        {
            gets(line);
            p = line;
            x = 0;
            while(*p)
            {
                x = (x + (*p - 'A' + 1)) & 3;
                ++p;
            }
            printf("%c
    ", directions[x]);
        }
        return 0;
    }

      【补充】由于旋转次数很少(不超过 100 次),因此如果我们一直对 x 进行累加,也不会溢出 int 的最大值。所以在 while 循环中的 MOD 操作可以去除,仅在最后输出结果时,对 x 进行一次 MOD 操作即可。

  • 相关阅读:
    Java中四种引用类型
    使用VisualVM查看Java Heap Dump
    Java程序性能分析工具Java VisualVM(Visual GC)—程序员必备利器
    JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
    设计模式2---建造者模式(Builder pattern)
    设计模式1---单例模式(Singleton pattern)
    移动端网络优化
    Http请求的 HttpURLConnection 和 HttpClient
    第四章 Activity和Activity调用栈分析 系统信息与安全机制 性能优化
    Android模块化编程之引用本地的aar
  • 原文地址:https://www.cnblogs.com/hoodlum1980/p/7419664.html
Copyright © 2011-2022 走看看