列表

详情


NC215079. 玩游戏

描述

作为程序员的你,一定很爱玩游戏。现在有一款2D平面游戏, 刚开始游戏人物在 (0,0) 位置, 按一下W会向上走一格, 按一下S 会向下走一格, 按一下A 向左走一格,按一下D向右走一格。在游戏中连续按某个方向键会获得加速效果。其中连续按两次W,第一次向上走一格, 第二次向上走两格。连续按三次W,则第一次向上走一格, 第二次向上走两格,第三次向上走三格, 如果连续按n次W,则第n次向上走n 格。同理,连续按多次S,连续按多次D, 连续按多次A也是一样。

例如游戏中的人物在(x, y)

按一次W:人物将移动到(x + 1, y)的位置。

按一次S:人物将移动到(x - 1, y)的位置。

按一次A:人物将移动到(x,y - 1)的位置。

按一次D:人物将移动到(x, y + 1) 的位置。

连续按两次W: 人物第一次将移动到(x + 1, y) 的位置, 第二次移动(x + 3, y) 的位置。

现在由于这个款游戏的开发者的代码写的太烂,每次按完方向键都要等上一整天游戏中的人物才会移动,由于你是个急性子很想快速的知道在你按完一些方向键游戏中的人物在2D平面中的位置。

现在给你一个字符串表示你按的方向键。问游戏中的人物按完这些方向键后停留的位置?(刚开始游戏的人物在坐标(0,0)位置)

输入描述

一行一个字符串,表示游戏中的方向键且保证数据只有W,A,S,D这四个字符。

输出描述

两个整数(用空格分开),表示按完这些方向键后游戏中的人物停留的位置。

示例1

输入:

WWWASSDW

输出:

4 0

说明:

第一次按W,游戏中的人物在(1, 0) ,按了一次W,向上走了一格。

第二次按W,游戏中的人物在(3, 0),连续按了两次W,第二次向上走了两格。

第三次按W,游戏中的人物在(6,0) ,连续按了三次W,第三次向上走了三格。

第四次按A,游戏中的人物在(6,-1) ,按了一次A,向左走一格。

第五次按S,游戏中的人物在(5,-1),按了一次S,向下走一格。

第六次按S,游戏中的人物在(3, -1),连续按了两次S,向下走两格。

第七次按D,游戏中的人物在(3,0),按了一次D,向右走一格。

第八次按W,游戏中的人物在(4,0),按了一次W,向上走一格。

所以输出 4 0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 48ms, 内存消耗: 3512K, 提交时间: 2021-03-10 22:17:40

#include<bits/stdc++.h>

using namespace std;


int main()
{
	string str;
	long x=0,y=0,i=0,x1=0,x2=0,y1=0,y2=0;
	cin>>str;
	while(i<str.size())
	{
		switch(str[i])
		{
		case 'W':y1++,y+=y1,x1=0,x2=0,y2=0; break;
		case 'S':y2++,y-=y2,x1=0,x2=0,y1=0; break;
		case 'A':x1++,x-=x1,x2=0,y1=0,y2=0; break;
		case 'D':x2++,x+=x2,x1=0,y1=0,y2=0; break;
		}
		i++;
	}
	cout<<y<<' '<<x;
	return 0;
}

C(clang11) 解法, 执行用时: 17ms, 内存消耗: 1272K, 提交时间: 2020-12-18 19:24:59

#include<stdio.h>
int main()
{
    char str[1000000];
    int x=0,y=0,w,a,s,d,i=0;
    w=a=s=d=0;
    scanf("%s",str);
    do{
        if(str[i]=='W'){w++;x=x+w;}
        if(str[i]=='A'){a++;y=y-a;}
        if(str[i]=='S'){s++;x=x-s;}
        if(str[i]=='D'){d++;y=y+d;}
        i++;
        if(str[i]!=str[i-1])w=a=s=d=0;
    }while(str[i]!='\0');
    printf("%d %d",x,y);
    return 0;
}

上一题