围绕 Farmer John 最大的草地的栅栏已经损坏了,如今他终于决定要换一个新的栅栏。
不幸的是,当 Farmer John 在铺设新栅栏时,一只巨大的蜜蜂突然出现,在他的草地上追着他跑,导致最后栅栏被沿着一条相当不规则的路径铺设。栅栏可以用一个字符串表示,每个字符为 "N"(north,北)、"E"(east,东)、"S"(south,南)、"W"(west,西)之一。每个字符表示一米长的一段栅栏。举例来说,如果字符串为 NESW,这表示栅栏从起点开始向北延伸 1 米,然后向东延伸 1 米,然后向南延伸 1 米,然后向西延伸 1 米,回到栅栏的起点。
栅栏的结束位置与开始位置相同,而这是栅栏的路径上唯一会被到达多次的位置(从而起始位置是唯一会被再次到达的位置,在栅栏结束之时)。结果,栅栏确实围起了一个草地上连通的区域,尽管这个区域可能形状十分奇特。
Farmer John 想要知道他铺设栅栏的路径是顺时针(当按字符串表示的顺序沿着栅栏的路径行走时被围起的区域位于右侧)还是逆时针(被围起的区域位于左侧)。
输入格式(从终端 / 标准输入读入):
输入的第一行包含一个整数 N(1<=N<=20)。以下 N 行每行包含一个长度不小于 4 且不超过 100 的字符串,表示一个栅栏的路径。
输出格式(输出至终端 / 标准输出):
对 N 条输入的栅栏路径的每一条,输出一行,为 "CW"(clockwise,顺时针)或 "CCW"(counterclockwise,逆时针)。
输入样例:
2
NESW
WSSSEENWNEESSENNNNWWWS
输出样例:
CW
CCW
以下为这两条栅栏路径,用 @ 表示起始位置:
*>*
^ v
@<*
*<*<*<*
v ^
*<@ *
v ^
* *>*>* *
v ^ v ^
* *<* * *
v ^ v ^
*>*>* *>*
供题:Brian Dean
1. #include <iostream> 2. #include <cstdio> 3. #include <string> 4. using namespace std; 5. int n; 6. string s; 7. 8. int angle(char a,char b){ 9. if(a==b)return 0; 10. else if(a=='E'&&b=='N') return 90; 11. else if(a=='N'&&b=='W') return 90; 12. else if(a=='W'&&b=='S') return 90; 13. else if(a=='S'&&b=='E') return 90; 14. else if(a=='E'&&b=='S') return -90; 15. else if(a=='S'&&b=='W') return -90; 16. else if(a=='W'&&b=='N') return -90; 17. else if(a=='N'&&b=='E') return -90; 18. } 19. 20. void clockwinse(string ts,int ls){ 21. int tj=0; 22. for(int i=0;i<ls-1;i++) 23. tj+=angle(ts[i],ts[i+1]); 24. tj+=angle(ts[ls-1],ts[0]); 25. if(tj<0) cout<<"CW"<<endl; 26. else cout<<"CCW"<<endl; 27. } 28. 29. int main() 30. { 31. cin>>n; 32. for(int i=1;i<=n;i++){ 33. cin>>s; 34. clockwinse(s,s.size()); 35. } 36. return 0; 37. }