为啥更改数组的顺序会导致超出时间限制?

Posted

技术标签:

【中文标题】为啥更改数组的顺序会导致超出时间限制?【英文标题】:Why does changing the order of array results in Time Limit Exceeded?为什么更改数组的顺序会导致超出时间限制? 【发布时间】:2018-09-13 20:23:15 【问题描述】:

这是经典的“骑士之旅”问题。我已经使用 x_mov[] 和 y_mov[] 来定义骑士将采取的下一个坐标。 问题是,当我(同时)重新排列数组 x_mov[] 和 y_mov[] 时,程序没有给出输出并导致 TLE。 但是当顺序是从0度到360度的方向时,输出是正确的。

static int N = 8;

public static void main(String args[])
    solveKTP();


static void solveKTP()
    int sol[][] = new int[N][N];

    for(int i=0;i<N;i++)
        for(int j=0; j<N;j ++)
            sol[i][j] = -1;

    sol[0][0] = 0;

    //This ORDER Does not give the result

    //int x_mov[] = 2, 2,-2,-2, 1,-1, 1,-1;
    //int y_mov[] = 1,-1, 1,-1, 2, 2,-2,-2;

    //This Order GIVES the correct result
    //Notice how the direction changes from 1st to 2nd to 3rd to 4th quadrant.

    int x_mov[] = 2, 1,-1,-2, -2, -1, 1, 2;
    int y_mov[] = 1, 2, 2, 1, -1, -2,-2,-1;

    if(backtrack(0,0,sol,x_mov,y_mov,1))
        printSol(sol);
    else
        System.out.println("Not Possible");




static boolean backtrack(int x ,int y, int sol[][], int x_mov[], int y_mov[], int movi)

    if(movi == N*N) 
        //System.out.println("Here");
        return true;
    

    for( int k = 0; k<8; k++)
         int next_x = x + x_mov[k];
         int next_y = y + y_mov[k];

        if(isSafe(next_x,next_y, sol))
            sol[next_x][next_y] = movi;

            if(backtrack(next_x,next_y, sol, x_mov, y_mov,movi+1))
                return true;
            else
                sol[next_x][next_y] = -1;
        
    
    return false;


static boolean isSafe(int x, int y, int sol[][])
    return (x>=0 && x<N && y>=0 && y<N && sol[x][y]==-1);


static void printSol(int sol[][])
    for(int i = 0; i < N; i++)
        for(int j = 0; j< N ; j++)
            System.out.print(sol[i][j]+ " ");
        System.out.println();
    


我已经搜索了答案,但找不到。如果有人能解释我为什么会发生这种情况,我将不胜感激。 如果您需要任何进一步的信息,请发表评论。

【问题讨论】:

【参考方案1】:

观察到同样的情况,随机检查值会导致太多的回溯,因为存在大量可能性 appx。 19,000,000 亿可能的旅行,它变得耗时,但它应该在一段时间内产生结果。

【讨论】:

以上是关于为啥更改数组的顺序会导致超出时间限制?的主要内容,如果未能解决你的问题,请参考以下文章

Android:更改视图顺序会导致“不幸的是,应用程序已停止”OK。为啥?

为啥链接库的顺序有时会导致 GCC 出错?

为啥链接库的顺序有时会导致 GCC 出错?

为啥“HTML 文件选择”会更改所选文件的顺序并按字母顺序排序?

为啥数组声明的顺序对性能影响如此之大?

为啥以不同的顺序运行我的测试会导致性能截然不同? [复制]