太久没有做 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 = ;
char *p;
char directions[] = "NWSE";
char line[];
scanf("%d\n", &count);
for(i = ; i < count; i++)
{
gets(line);
p = line;
x = ;
while(*p)
{
x = (x + (*p - 'A' + )) & ;
++p;
}
printf("%c\n", directions[x]);
}
return ;
}

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

ZOL 3977. Pointers的更多相关文章

  1. Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II

    题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...

  2. Leetcode 笔记 116 - Populating Next Right Pointers in Each Node

    题目链接:Populating Next Right Pointers in Each Node | LeetCode OJ Given a binary tree struct TreeLinkNo ...

  3. [LeetCode] Populating Next Right Pointers in Each Node II 每个节点的右向指针之二

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  4. [LeetCode] Populating Next Right Pointers in Each Node 每个节点的右向指针

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  5. [c++] Smart Pointers

    内存管理方面的知识 基础实例: #include <iostream> #include <stack> #include <memory> using names ...

  6. python爬虫学习(2) —— 爬一下ZOL壁纸

    我喜欢去ZOL找一些动漫壁纸当作桌面,而一张一张保存显然是太慢了. 那怎么办呢,我们尝试使用简单的爬虫来解决这个问题. 0. 本爬虫目标 抓取给定分类「或子分类」网址的内容 分析并得到每个分类下的所有 ...

  7. LEETCODE —— Populating Next Right Pointers in Each Node

    Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeLinkNode * ...

  8. LeetCode OJ 116. Populating Next Right Pointers in Each Node

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  9. Pointers and Dynamic Allocation of Memory

    METHOD 1: Consider the case where we do not know the number of elements in each row at compile time, ...

随机推荐

  1. asp.net mvc global.asax文件详解

    一.文件概述 global.asax这个文件包含全局应用程序事件的事件处理程序.它响应应用程序级别和会话级别事件的代码. 运行时, Global.asax 将被编译成一个动态生成的 .NET Fram ...

  2. Linux matlab.desktop文件

    matlab建立菜单文件老是闪退,须用 matlab -desktop 完整配置 matlab.desktop [Desktop Entry] Name=MATLAB Exec=/usr/local/ ...

  3. Java程序第一次作业

    public class yjj { public static void main(String[] args) { System.out.println("Hello Java" ...

  4. http协议常见状态码含义

    状态码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值: 2xx:成功--表示请求已被成功接收.理解.接受 200(成功)  服务器已成功处理了请求.通常,这表示服务器提供了请求的网页. ...

  5. JMeter在linux服务器上使用

    环境部署: 1.在Linux服务器先安装jdk:此步骤省略,可参考百度经验:https://jingyan.baidu.com/article/6b18230980c294ba59e15967.htm ...

  6. Map<String,Integer>acount字符串出现的次数

  7. TableLaout

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  8. rem,em,与px的比较用法

    在Web中使用什么单位来定义页面的字体大小,至今天为止都还在激烈的争论着,有人说PX做为单位好,有人说EM优点多,还有人在说百分比方便,以至于出现了CSS Font-Size: em vs. px v ...

  9. web框架---django

    15:31:14一.web框架1.框架:即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. ...

  10. [ZJOI2007]矩阵游戏【bzoj1059/洛谷1129】/ [HEOI2016/TJOI2016]游戏

    小QQ是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N \times NN×N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种 ...