我正在尝试使用给定Knight Tour problem的bactracking来解决on this site。
网站takes about 0.49 seconds on ideone上的实施。
int solveKTUtil(int x, int y, int movei, int sol[N][N], int xMove[N],
int yMove[N])
{
int k, next_x, next_y;
if (movei == N*N)
return true;
/* Try all next moves from the current coordinate x, y */
for (k = 0; k < 8; k++)
{
next_x = x + xMove[k];
next_y = y + yMove[k];
if (isSafe(next_x, next_y, sol))
{
sol[next_x][next_y] = movei;
if (solveKTUtil(next_x, next_y, movei+1, sol, xMove, yMove) == true)
return true;
else
sol[next_x][next_y] = -1;// backtracking
}
}
return false;
}
虽然我实施的几乎相同的是showing time limit exceeded(more than 5 seconds) on ideone。
int generateMoves(int x, int y, int moveNum, int soln[][N], int xMoves[], int yMoves[])//making move number 'moveNum' from x and y.
{
if(moveNum == N*N){
return 1;
}
else{
int i, nextX, nextY;
for(i=0; i<8; ++i){
nextX = x + xMoves[i];
nextY = y + yMoves[i];
if(isSafe(nextX, nextY, soln)){
soln[nextX][nextY] = moveNum;
if( generateMoves(nextX, nextY, moveNum+1, soln, xMoves, yMoves) ){
return 1;
}
else{
soln[nextX][nextY] = -1;
}
}
}
return 0;
}
}
在我的代码中执行了多长时间?
答案 0 :(得分:6)
更改xMoves / yMoves似乎有效:ideone。它可能只是搜索顺序,导致它更早找到解决方案。
有太多可能的63,62,61等长度巡回赛无法到达最终剩余的方格。在最坏的情况下,蛮力搜索必须经历所有这些搜索。通过尝试一系列导致早期解决方案的移动,算法运行得很幸运。
答案 1 :(得分:1)
您的帖子未显示您的代码与原始代码之间的差异。
事实上,如果你仔细查看你的代码,你和正确的代码之间只有这样:
int xMoves[] = { 2, 1, -1, -2, -2, -1, 1, 2 };//{2, 2, 1, 1, -1, -1, -2, -2};
int yMoves[] = { 1, 2, 2, 1, -1, -2, -2, -1 };//{1, -1, -2, 2, -2, 2, -1, 1};
订单不同。你在纸上绘制可能的动作,你可以发现正确的动作是逆时针顺序,而你的动作完全无序。
这一定是造成你问题的原因。