为啥更改数组的顺序会导致超出时间限制?
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。为啥?