過久沒有作 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 操做便可。