过久没有作 zoj,对 oj 来讲,因为它高度的”黑盒性“(输入数据和答案彻底保密),保护自信心是很是重要的。因此我先选择一道很是简单的题目刷起。本题目是一个至关简单的题目,难度系数和求 A+B 至关。数组
本题,已知一个指针,初始状态指向 N(北),如今对指针作一系列顺时针(C)或者逆时针(A)旋转 90 度的操做,问指针而后指向哪一个方向。spa
因为四个方向造成一个循环,因此很天然的提示出,把四个方向所在的”圆环“展开成一个数组,全部的旋转操做其实是移动数组内的索引,对索引进行递增或者递减的操做。而后对索引进行对数组长度的 MOD (取余)操做,限制在合理范围内便可。指针
设索引值为 x,初始值为 0,定义向逆时针方向旋转定义为正方向,则:code
逆时针(A)旋转 90 度:x = ( x + 1 ) % 4;blog
顺时针(C)选择 90 度:x = ( x - 1 + 4 ) % 4 = ( x + 3 ) % 4;索引
所以,咱们须要把旋转方向(A 或 C),映射到对 x 的递增值(1 或 3 )上。所以咱们发现这里有一个巧合:A 和 C 之间的差值(C - A = 2),刚好也是这个递增值之间的差值( 3 - 1 = 2)。因此这个映射关系,不须要使用条件判断,能够直接写出此映射关系:get
x = ( x + *p - 'A' + 1 ) % 4; ( *p = 'A' 或 'C' )io
若是咱们进一步查阅一下 ASCII 码表,上面的代码也等效于:class
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\n", &count); for(i = 0; i < count; i++) { gets(line); p = line; x = 0; while(*p) { x = (x + (*p - 'A' + 1)) & 3; ++p; } printf("%c\n", directions[x]); } return 0; }
【补充】因为旋转次数不多(不超过 100 次),所以若是咱们一直对 x 进行累加,也不会溢出 int 的最大值。因此在 while 循环中的 MOD 操做能够去除,仅在最后输出结果时,对 x 进行一次 MOD 操做便可。