NC220555. 天旋地转
描述
二维平面上有一个点,假定你的位置在原点,面向 方向(右方是 )。
注意,你面朝的方向始终没有发生改变,变化的是这个世界,请输出你最后的位置。
输入描述
输入的第一行给出一个正整数 ,代表测试数据的组数。
每组测试数据的第一行有个正整数,代表操作的的次数。接下来有 行,每行有一个字母和一个整数 ,分别表示操作和该操作重复的次数。
只会是其中之一。
输出描述
对于每组测试数据在一行中输出两个数字。第一个数字为 的座标值,第二个为 的座标值,中间以一个空格隔开。
示例1
输入:
2 4 d 3 r 1 d 2 w 1 7 s 1 l 1 a 1 l 3 w 1 l 1 d 1
输出:
2 2 0 0
说明:
Python3 解法, 执行用时: 1355ms, 内存消耗: 4608K, 提交时间: 2022-06-23 09:43:21
import sys input=sys.stdin.readline dir=[[0,1],[1,0],[0,-1],[-1,0]] #顺时针定义方向 op={'w':0,'d':1,'s':2,'a':3} xz={'r':1,'l':-1} t=int(input()) for _ in range(t): x=y=0 try: n=int(input()) basedir=0 for i in range(n): s,k=input().split() k=int(k) adir=[] if s in 'rl': basedir-=k*xz[s] basedir%=4 else: p=(basedir+op[s])%4 adir=dir[p] x+=adir[0]*k y+=adir[1]*k #print('i步',s,k,adir,x,y) except: pass print(x,y)
C++ 解法, 执行用时: 198ms, 内存消耗: 12004K, 提交时间: 2021-05-18 22:32:20
#include<bits/stdc++.h> using namespace std; int n,k,dir,T,V[205],dx[]={0,1,0,-1},dy[]={1,0,-1,0}; int main() { char op; V['w']=0,V['a']=3,V['d']=1,V['s']=2; long long x,y; scanf("%d",&T); while(T--) { scanf("%d",&n); x=y=dir=0; while(n--) { scanf(" %c%d",&op,&k); if(op=='r')dir=(dir-k%4+4)%4; else if(op=='l')dir=(dir+k)%4; else x+=k*dx[(dir+V[op])%4],y+=k*dy[(dir+V[op])%4]; } printf("%lld %lld\n",x,y); } return 0; }