C++ 为什么两个几乎相同的实现的执行时间相差很大?
我正试图用给定的方法解决这个问题 在现场实施C++ 为什么两个几乎相同的实现的执行时间相差很大?,c++,c,performance,execution-time,C++,C,Performance,Execution Time,我正试图用给定的方法解决这个问题 在现场实施 intsolvektutil(intx,inty,intmovei,intsol[N][N],intxmove[N], int-yMove[N]) { int k,next_x,next_y; if(movei==N*N) 返回true; /*尝试从当前坐标x,y开始的所有下一步移动*/ 对于(k=0;k
intsolvektutil(intx,inty,intmovei,intsol[N][N],intxmove[N],
int-yMove[N])
{
int k,next_x,next_y;
if(movei==N*N)
返回true;
/*尝试从当前坐标x,y开始的所有下一步移动*/
对于(k=0;k<8;k++)
{
下一步x=x+x移动[k];
next_y=y+yMove[k];
if(isSafe(下一个x,下一个y,sol))
{
sol[next_x][next_y]=movei;
if(solveKTUtil(next_x,next_y,movei+1,sol,xMove,yMove)==true)
返回true;
其他的
sol[next_x][next_y]=-1;//回溯
}
}
返回false;
}
而我实现的一个几乎相同的是
int-generateMoves(int-x,int-y,int-moveNum,int-soln[][N],int-xMoves[],int-yMoves[])//从x和y生成移动编号'moveNum'。
{
如果(moveNum==N*N){
返回1;
}
否则{
int i、nextX、nextY;
对于(i=0;i更改xMoves/yMoves似乎有效:。它可能只是搜索顺序导致它更早地找到解决方案
有太多可能的63、62、61等长度的巡更无法到达最后剩下的方块。在最坏的情况下,蛮力搜索必须遍历所有方块。运行的算法只是通过尝试一系列动作而幸运地提前找到了解决方案。您的帖子没有显示代码和搜索结果之间的差异和原来的一样。
事实上,如果仔细查看代码,您的代码与正确代码之间的唯一区别是:
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};
顺序不同。你在一张纸上画出可能的动作,你会发现正确的动作是逆时针顺序的,而你的动作完全是无序的。
这一定是导致您出现问题的原因。您是否尝试过分析代码以查看其花费的时间?两种情况下的isSafe
函数是否相同?是的,isSafe在两种情况下都是相同的。请在此处查看我的完整代码,在此处查看其他代码。出于某种原因,您的代码版本将永远运行。看不到明显的原因为什么。我建议你再看一遍代码,看看有什么不同。太好了…非常感谢。你能解释一下这种行为的原因吗?请。
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;
}
}
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};