UVA问题12503给出了TLE

时间:2015-06-18 18:45:16

标签: c

我正在尝试解决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?

1 个答案:

答案 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];
}