机器人Runtime Error 0 分求调

3.  机器人
题目ID:11072必做题100分
最新提交:
Runtime Error
0 分
历史最高:
Runtime Error
0 分
时间限制: 1000ms
空间限制: 524288kB
题目描述
早苗入手了最新的Gundam模型。最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧。

早苗的新模型可以按照输入的命令进行移动,命令包括‘E’、‘S’、‘W’、‘N’四种,分别对应东南西北。执行某个命令时,它会向对应方向移动一个单位。作为新型机器人,它可以执行命令串。对于输入的命令串,每一秒它会按命令行动一次。执行完命令串的最后一个命令后,会自动从头开始循环。在0时刻时机器人位于(0,0)。求T秒后机器人所在位置坐标。

【注意】

向东移动,坐标改变改变为(X+1,Y);

向南移动,坐标改变改变为(X,Y-1);

向西移动,坐标改变改变为(X-1,Y);

向北移动,坐标改变改变为(X,Y+1);

输入格式
第1行:一个字符串,表示早苗输入的命令串,保证至少有1个命令

第2行:一个正整数T

输出格式
2个整数,表示T秒时,机器人的坐标。

样例
Input 1
NSWWNSNEEWN
12
Output 1
-1 3
数据范围
【数据范围】

对于60%的数据 T<=500,000 且命令串长度<=5,000

对于100%的数据 T<=2,000,000,000 且命令串长度<=5,000

我的代码:

#include <bits/stdc++.h>

using namespace std;

int main ()
{
	string str;
	cin >> str;
	
	long long t;
	cin >> t;
	
	long long x = 0, y = 0;
	long long len = str.size();
	if (t <= len) {
		for (long long i = 0; i < t; i++){
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
			cout << x << ' ' << y;
		}
	} else if (t > len) {
		for (long long i = 0; i < len; i++){
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
		}
		long long a = t - len;
		for (long long i = 0; i < a; i++){
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
		}
		
		cout << x << ' ' << y;
	}
	
	return 0;
}

万一t-len还是大于len怎么办

有道理,去改改

Runtime Error 0 分

/*
11072
*/

#include <bits/stdc++.h>

using namespace std;

int main ()
{
	int x = 0, y = 0;
	
	string str;
	cin >> str;
	
	int t;
	cin >> t;
	
	int len = str.size();
	
	if (t <= len || len >= t) {
		for (int i = 0; i < t; i++) {
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
		}
		cout << x << ' ' << y;
		return 0;
	} else if (t > len) {
		for (int i = 0; i < t; i++) {
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
		}
		int sum = t / len;
		for (int i = 0; i < sum; i++){
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
		}
		cout << x << ' ' << y;
	}
	
	return 0;
}

@俞天行 在?

t>len了你还用t?

这个循环条件改成0~len-1,然后外面套一层1~t/len,最后sum改成t%l

Time Limit Exceeded 75 分

/*
11072
*/

#include <bits/stdc++.h>

using namespace std;

int main ()
{
	int x = 0, y = 0;
	
	string str;
	cin >> str;
	
	int t;
	cin >> t;
	
	int len = str.size();
	
	if (t <= len || len >= t) {
		for (int i = 0; i < t; i++) {
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
		}
		cout << x << ' ' << y;
		return 0;
	} else if (t > len) {
		for (int j = 1; j <= t / len; j++) {
			for (int i = 0; i <= len - 1; i++) {
				if (str[i] == 'E') {
					x += 1;
				}
				if (str[i] == 'S') {
					y -= 1;
				}
				if (str[i] == 'W') {
					x -= 1;
				}
				if (str[i] == 'N') {
					y += 1;
				}
			}
		}
		int sum = t % len;
		for (int i = 0; i < sum; i++){
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
		}
		cout << x << ' ' << y;
	}
	
	return 0;
}

@yhxyd0104 @yhxyd0109 在吗?

@叶安槿 他不在
image
直接被封了100年

不过我可以帮你看一下

@叶安槿 不能这样直接暴力,复杂度为 O(T)
寻找周期规律,假设字符串长度 len ,如果 T < 2\times len 就直接那样暴力
否则就先跑一遍字符串,看一看执行完一个字符串的操作后位置的变化(横坐标、纵坐标增加或减少了多少),随后看看 T / len 向下取整是多少,随后用这个得数记作 q ,然后从原点遍历 q 次,每次执行一遍字符串后位置的变化
接着从头遍历字符串,共 T mod len 次遍历,就按着 str[i] 行动,最后输出结果即可

@叶安槿 在吗?
核心代码给一个
code

int len = str.size();
if (t < 2 * len) {
	______//暴力做法  
}
int xx = 0, yy = 0;//定义变量,每跑一次字符串位置的变化情况  
for (int i = 0 ; i < len ; i++) {
	if (str[i] == 'E') {
		xx += 1;
	}
	if (str[i] == 'S') {
		yy -= 1;
	}
	if (str[i] == 'W') {
		xx -= 1;
	}
	if (str[i] == 'N') {
		yy += 1;
	}
}
//计算变化情况  
x += t / len * xx;
y += t / len * yy;
//计算变化(全部完整字符串的变化) 
for (int i = 0 ; i < t % len ; i++) {
	if (str[i] == 'E') {
		x += 1;
	}
	if (str[i] == 'S') {
		y -= 1;
	}
	if (str[i] == 'W') {
		x -= 1;
	}
	if (str[i] == 'N') {
		y += 1;
	}
}
//计算剩下不完整字符串的变化 
1 个赞
/*
11072
*/

#include <bits/stdc++.h>

using namespace std;

int main ()
{
	int x = 0, y = 0;
	
	string str;
	cin >> str;
	
	int t;
	cin >> t;
	
	int len = str.size();
	
	if (t <= len || len >= t) {
		for (int i = 0; i < t; i++) {
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
		}
		cout << x << ' ' << y;
		return 0;
	} else if (t > len) {
		for (int j = 1; j <= floor(t / len); j++) {
			for (int i = 0; i <= len - 1; i++) {
				if (str[i] == 'E') {
					x += 1;
				}
				if (str[i] == 'S') {
					y -= 1;
				}
				if (str[i] == 'W') {
					x -= 1;
				}
				if (str[i] == 'N') {
					y += 1;
				}
			}
		}
		int sum = t % len;
		for (int i = 0; i < sum; i++){
			if (str[i] == 'E') {
				x += 1;
			}
			if (str[i] == 'S') {
				y -= 1;
			}
			if (str[i] == 'W') {
				x -= 1;
			}
			if (str[i] == 'N') {
				y += 1;
			}
		}
		cout << x << ' ' << y;
	}
	
	return 0;
}

这是我的,TLE75

已AC,谢谢

有人关帖吗?可以关了