八皇后问题

针对八皇后问题思路如下:

        用一个数组arrQueen[]来存储皇后的位置,从第一行开始按照按照次序选择一个可以拜访的位置,如果该位置 i 可以放置,那就将置数组arrQueen[0]=i;  然后进行第二行的位置筛选,如果并且从第一列开始,如果该位置 i 与数组中已经确定的位置不冲突,那就将皇后放置在该位置 也就是arrQueen[1]=i;然后 重复上述操作进行下面某行的列的筛选,如果可以就arrQueen[row]=i,然后再下一行,如果不可以就进行下一列的选择判断。如果再row==8的时候,说明八个皇后都已经成功放入并且没有冲突,说明成功,成功之后将arrQueen[7]]=-1; 另外再遍历完行row的时候,都需要将arrQueen[row]=-1,便于不影响其他行的操作。

代码如下:

package Recursion;

import java.util.Arrays;

//解决八皇后问题
public class Queen {
    //用一维数组记录皇后的位置  arrQueen[i]=j   位置为[i][j]
    int arrQueen[]=new int[8];
    int sum=0;
    public Queen(){
        Arrays.fill(arrQueen,-1);
    }
    public static void main(String[] args) {
        new Queen().fun(0);
    }
    //解决方法
    public void fun(int row){
        //八行全部放满 那么说明可以
        if(row==8){
            sum++;
            System.out.print("第"+sum+"种方法:");
            print(arrQueen);
            //修改最后一个值
            arrQueen[7]=-1;
        }else{
            if(row==0){
                for(int i=0;i<8;i++){
                    arrQueen[row]=i;
                    fun(row+1);
                }
            }
            else{//可以到达这一步的说明上一行之前的皇后位置是合理的,现在需要做的就是判断本行的哪些位置放置皇后是合理的
                for(int i=0;i<8;i++){
                    //判断该位置是否合理
                    //第row行表示arrQueen中已经有row的个元素 此处的行是从0开始的
                    boolean legal=true;
                    for(int j=0;j<row;j++){
                        //判断坐标为[row,i]位置是否可以放置皇后
                        //如果i==arrQueen[j]     说明位于同一列
                        //row+i==j+arrQueen[j]  说明位于同一斜线
                        //i-row==arrQueen[j]-j  说明位于同一斜线
                        if(i==arrQueen[j]||row+i==j+arrQueen[j]||i-row==arrQueen[j]-j){
                            legal=false;
                            break;
                        }
                    }
                    if(legal){
                        arrQueen[row]=i;
                        fun(row+1);
                    }
                    //该行遍历完 将该行对应的元素置为-1,以便上一行的元素继续遍历
                }
                arrQueen[row]=-1;
            }
        }

    }
    public void print(int arr[]){
        for(int i=0;i<8;i++){
            System.out.print(arrQueen[i]+" ");
        }
        System.out.println();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值