n皇后求解单一解问题

文章参考了博客http://blog.csdn.net/hackbuteer1/article/details/6657109,该文对n皇后问题进行了详细的阐述,并给出了全部解问题的C的实现

仿照其实现,在此备份求单一解的Java程序。

public class Main {
    static final int num = 2;       //皇后数量
    static final int non = -10000;  //代表空棋盘
    
    void Init(int n, int [] chessboard){  //棋盘的初始化
        for (int i=0;i<n;i++){
            chessboard[i] = non;
        }
    }//Init
    
    boolean NoClash (int row, int col,int[] chessboard){ //判断皇后是否产生冲突,没有冲突返回true
        for(int i=0;i<num;i++){
            if(chessboard[i] == col|| Math.abs(i-row)==Math.abs(chessboard[i]-col)){
                return false;
            }
        }
        return true;
    }//Clash
    
    void print(int[] chessboard){
        for(int i=0;i<num;i++){
            System.out.print(chessboard[i]+" ");
        }
    }
    
    public static void main(String[] args) {
        int n = num;
        int flag = 0; //flag 代表解的个数
        int [] chessboard = new int[n];
        Main m = new Main();
        m.Init(n,chessboard);
        int i=0,j=0; //i进行行扫描,j进行列扫描
        while(i<n){
            while(j<n){
                if(m.NoClash(i, j, chessboard)){  //位置i,j可以放一个皇后
                    chessboard[i] = j;   //在i行j列放一个皇后
                    j = 0;               //下一行从第0列开始放置皇后
                    break;
                }//if
                else{
                    j++;                //在j+1列进行尝试
                }//else
            }//while(j<n)
            if(chessboard[i] == non){ //第i行没能找到解
                if(i == 0)            //i是第一行了,说明没有解了
                    break;
                else{                 //否则要进行回溯
                    i--;              //上一行
                    j = chessboard[i]+1;   //j从上一行的原位置+1开始搜索
                    chessboard[i] = non;   //清空第i行棋盘
                    continue;              
                }//else
            }//if
            if(i==num -1){            //在最后的一行找到了位置,即找到了解
                m.print(chessboard);
                flag++;
                break;
            }//if
            i++;
        }//while(i<n)
        if(flag == 0){
            System.out.println("无解");
        }
    }//main
}

发布了32 篇原创文章 · 获赞 1 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/lhf2112/article/details/52813918