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};