BFS" Digit Jump"解决方案在机器上工作正常,在网上判断时获得TLE

时间:2015-08-02 16:23:09

标签: infinite-loop breadth-first-search

此代码适用于问题DIGJUMP

它为我尝试的所有输入提供了正确的输出(我已经尝试了很多)。但问题是它在codechef上提交它时会得到TLE。我检查了社论,并且相同的解决方案(概念方面)被接受,因此这意味着算法方法是正确的。我必须在实施中出错。

我尝试了很长时间,但无法弄清楚出了什么问题。

#include <string.h>
#include <vector>
#include <queue>
#include <stdio.h>

using namespace std;

class Node
{
    public:
    int idx, steps;
};

int main()
{
    char str[100001];
    scanf("%s", str);
    int len = strlen(str);

    vector<int> adj[10];
    for(int i = 0; i < len; i++)
        adj[str[i] - '0'].push_back(i);

    int idx, chi, size, steps;
    Node tmpn;
    tmpn.idx = 0;
    tmpn.steps = 0;

    queue<Node> que;
    que.push(tmpn);

    bool * visited = new bool[len];
    for(int i = 0; i < len; i++)
        visited[i] = false;

    while(!que.empty())
    {
        tmpn = que.front();
        que.pop();
        idx = tmpn.idx;
        steps = tmpn.steps;
        chi = str[idx] - '0';

        if(visited[idx])
            continue;
        visited[idx] = true;

        if(idx == len - 1)
        {
            printf("%d\n", tmpn.steps);
            return 0;
        }

        if(visited[idx + 1] == false)
        {
            tmpn.idx = idx + 1;
            tmpn.steps = steps + 1;
            que.push(tmpn);
        }

        if(idx > 0 && visited[idx - 1] == false)
        {
            tmpn.idx = idx - 1;
            tmpn.steps = steps + 1;
            que.push(tmpn);
        }

        size = adj[chi].size();
        for(int j = 0; j < size; j++)
        {
            if(visited[adj[chi][j]] == false)
            {
                tmpn.idx = adj[chi][j];
                tmpn.steps = steps + 1;
                que.push(tmpn);
            }
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

此解决方案无法在可接受的时间内完成此问题。请记住,BFS是O(E)。在具有某种O(n)数字的字符串中,在这些数字之间存在O(n ^ 2)个边。对于N = 10 ^ 5 O(N ^ 2)太多。

这需要一些优化,比如我们从类似的节点来到当前节点,我们不会进一步跳到类似的节点。