太久没有做 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. 最近的AI

    虚拟币和AI  两个大类怎么兴起?

  2. 用chrome和anywhere,配合安卓机搭建最简单的移动端页面测试。

    很多时候,我们前端在写移动端页面的时候,虽然目前chrome有调试模式,可以模拟手机的部分效果,但仍有部分效果需要直接在手机上进行页面的调试,今天就在这里推荐一个适合windows+安卓的无需连接局域 ...

  3. Debian系统 + XFCE桌面初识,基础环境搭建

    有幸分享个人的Linux下的习惯配置,具体操作可能阐述得比较粗糙. 在图形化界面进行配置操作,十分简便舒心. Linux发行版:Debian9.5(Stretch) 桌面Sesion:XFCE4 一. ...

  4. EOS wallet API 报HTTP 400错误

    服务器:192.168.8.144 按照官方的docker方式运行的,因为keosd(钱包)开出来的API只容许本地访问,即: url --request POST --header 'Host: 0 ...

  5. flume实现kafka到hdfs测试用例

    kafka 到hdfs at1.sources =st1 at1.channels = ct1 at1.sinks = kt1 # For each one of the sources, the t ...

  6. 爬虫基础之urllib库

    urllib库的基本使用 urlopen() # 导入urllib库 import urllib # 往指定url发送请求,返回一个响应对象 response = urllib.request.url ...

  7. java根据ip地址获取详细地域信息的方法

    通过淘宝IP地址库获取IP位置(也可以使用新浪的) 请求接口(GET):http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串] 响应信息:(jso ...

  8. amoeba 使用笔记

    环境 延用MySQL 主主+主从笔记的环境 Java version “1.8.0_73” 安装 wget http://nchc.dl.sourceforge.net/project/amoeba/ ...

  9. 批量镜像locator(比如表情模板)

    #外挂   镜像loc     前缀  lf  镜像给   rt   选中其中一个会镜像另一个 myPrefix='lf_'myMdf='rt_' myselectLoc=mc.ls(sl=1)for ...

  10. 【python】问题汇总

    1.pip降级 python -m pip install pip==9.0.3 2. Flask利用pymysql出现Warning:1366的解决办法 错误提示:(1366, "Inco ...