列表

详情


NC220555. 天旋地转

描述

二维平面上有一个点,假定你的位置在原点,面向 方向(右方是 )。

种操作,其中为参数,表示该操作重复的次数:

  1. r :整个世界的坐标系转 k 次,每次顺时针转 90 度。
  2. l :整个世界的坐标系转 k 次,每次逆时针转 90 度。 
  3. w :往前方走 k 个单位
  4. a :往左方走 k 个单位
  5. d :往右方走 k 个单位 
  6. s : 往后方走 k 个单位

注意,你面朝的方向始终没有发生改变,变化的是这个世界,请输出你最后的位置。

输入描述

输入的第一行给出一个正整数 ,代表测试数据的组数。
每组测试数据的第一行有个正整数,代表操作的的次数。接下来有 行,每行有一个字母和一个整数 s_i, k_i,分别表示操作和该操作重复的次数。

s_i只会是其中之一。

输出描述

对于每组测试数据在一行中输出两个数字。第一个数字为  的座标值,第二个为  的座标值,中间以一个空格隔开。

示例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

说明:

第一组测试数据的移动路径为:
1. d \quad 3:\rightarrow (3,0)
2. r \quad 1:整个世界顺时针旋转90度,你目前面向 {x-}
3. d \quad 2: \rightarrow (3,2)
4. w \quad 1: \rightarrow (2,2)

第二组测试数据的移动路径为:
1. s \quad 1:\rightarrow (0,-1)
2. l \quad 1:整个世界逆时针旋转90度,你目前面向 {x+}
3. a \quad 1: \rightarrow (0,0)
4. l \quad 3:整个世界逆时针旋转90度3次,你目前面向 {y+}
5. w \quad 1:\rightarrow (0,1)
6. l \quad 1:整个世界逆时针旋转90度,你目前面向 {x+}
7. d \quad 1:\rightarrow (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;
}

上一题