我正在尝试解决UVA在线判断的12503问题。我想我已经找到了解决方案,但它给了我TLE。这是问题所在:
你的机器人站在x轴的原点上。机器人将获得一些指示。 你的任务是在执行所有指令后预测它的位置。
•LEFT:向左移动一个单位(将p减小1,其中p是移动前机器人的位置)
•右:向右移动一个单位(将p增加1)
•SAME AS i:执行与第i条指令相同的操作。保证我是积极的
输入 整数不大于此前的指令数。 第一行包含测试用例数T(T <= 100)。每个测试用例以指令数的整数n(1 <= n <= 100)开始。以下n行中的每一行都包含一条指令。
输出
对于每个测试用例,打印机器人的最终位置。注意,在处理完每个测试用例之后, 机器人应该重置为原点。
示例输入
2
3
LEFT
RIGHT
SAME AS 2
5
LEFT
SAME AS 1
SAME AS 2
SAME AS 1
SAME AS 4
示例输出
1
-5
这是我在C代码中的代码:
#include <stdio.h>
char com[102][20];
int command(char comd[], int pos);
int main() {
int t;
int pos;
int i, n;
char tmp[20];
scanf("%d", &t);
for(i = 0; i < t; i++) {
scanf("%d", &n);
int j;
pos = 0;
for (j = 0; j < n; j++) {
gets(com[j]);
if (strcmp(com[j], "LEFT") == 0)
pos--;
else if(strcmp(com[j], "RIGHT") == 0)
pos++;
else {
pos = command(com[j], pos);
}
}
printf("%d\n", pos);
}
return 0;
}
int command(char comd[], int pos) {
if (strcmp(comd, "LEFT") == 0) {
pos--;
return pos;
}
else if (strcmp(comd, "RIGHT") == 0) {
pos++;
return pos;
}
else{
int a = atoi(&comd[8]);
return command(com[a-1], pos);
}
}
是否有任何建议为什么此代码提供TLE?
答案 0 :(得分:0)
在int command(char comd[], int pos)
函数中,您在最后一行使用递归调用。这可能导致TLE。
要解决此问题,您可以使用另一个数组来存储机器人在命令中执行的步数。您只需稍后访问该数组的索引即可获取上一个命令的步骤。
我将如何做到这一点 -
#include <stdio.h>
#include <string.h>
int move[110];
int getMove(char inp[], int);
int main()
{
int t, n;
char inp[50];
scanf(" %d ",&t);
while(t--)
{
scanf(" %d ",&n);
int i, pos = 0;
for(i = 0; i < n; i++)
{
gets(inp);
pos += getMove(inp, i);
}
printf("%d\n",pos);
}
return 0;
}
int getMove(char inp[], int i)
{
if(inp[0]=='S')
{
int j;
sscanf(strrchr(inp,' ')," %d",&j);
move[i] = move[j - 1];
}
else
{
move[i] = (inp[0] == 'L') ? -1 : 1;
}
return move[i];
}