题目描述
题目描述:
牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含一个正整数,表示转方向的次数N(N<=1000)。
接下来的一行包含一个长度为N的字符串,由L和R组成,L表示向左转,R表示向右转。
输出描述:
输出牛牛最后面向的方向,N表示北,S表示南,E表示东,W表示西。
时间限制:1秒 空间限制:32768K
题目分析
看见这道题的第一反应,便是可以用一个枚举型变量来模拟牛牛面向的方向,依次迭代转向来更新面向的方向。但是这不是一个很好的解决方案。根据我们的生活经验很容易得出转向问题具有以下三点性质。
第一点,两次转向之间具有交换律,即先向右转再向左转等价于先向左转再向右转。
第二点,不同方向的转向能相互抵消,即向右转再向左转等价于不转向。
第三点,连续向一个方向转4次等价于没有转向。
接下来的解决方案便是基于以上三点求得。
解决方案
由于转向具有交换律,因此无需在迭代转向时,时刻更新面向的方向,只需统计向左转与向右转的次数。接着,根据第二条性质,将其两者次数相减,然后根据第三条性质,将差对4取余即可得出等价的转向次数。
下面给出其核心代码吧。
for(int i=0;i<n;i++)
{
if('L'==d.at(i))//n为牛牛转向的次数,d为记录牛牛转向的字符串
t--;
else
t++;
}
t=t%4;//t为等价的向右转的次数
明天的题
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。