骑士之旅(回溯)

时间:2014-03-15 16:50:27

标签: java backtracking

我正试图用8 * 8棋盘解决骑士的巡回赛问题。但我的回溯是无限循环。我的逻辑功能如下: -

N是8。

  boolean algo(int x,int y,int no_of_moves,int sol[][]){

        if(no_of_moves==N*N){
            return true;
        }

        int nextx;
        int nexty;
        for(int i=0;i<8;i++){

            nextx=x+move_x[i];
            nexty=y+move_y[i];

            if(is_valid(nextx,nexty)){
                sol[nextx][nexty]=no_of_moves;

                if(algo(nextx,nexty,no_of_moves+1,sol)){
                    return true;
                }
                else
                    sol[nextx][nexty]=-1;

            }
        }
        return false;  
    }

sol [] []存储骑士所做的动作。

数组move_x和move_y存储要添加到x和y的值以获得骑士的下一个位置。

 int move_x[]={  2, 1, -1, -2, -2, -1,  1,  2 };
    int move_y[]={  1, 2,  2,  1, -1, -2, -2, -1 };

我首先将x传递为0,将y传递为0,将no_of_moves传递为1,将sol [] []中的所有值传递为-1 sol [0] [0]为0。

is_valid()检查nextxnexty是否在棋盘内且尚未访问过。

boolean is_valid(int xnext,int ynext)
    {
        if(xnext>=0 && xnext<N && ynext>=0 && ynext<N && sol[xnext][ynext]==-1)
        { 
            return true;
        }
        else 
        {
            return false; 
        }
    }

1 个答案:

答案 0 :(得分:0)

我没有看到代码有任何问题。我怀疑它不会进入无限循环,而是进入需要很长时间的循环。

查看它是否适用于5x5电路板(animation)。