实验 - NPC问题(回溯算法、聚类分析)

本文介绍了一个N皇后问题的解决方案,通过递归回溯的方法找到所有可行的摆放方案,并使用Java实现。该程序能够适用于任意大小的棋盘,通过判断皇后间的相对位置来避免冲突。



八皇后及N皇后问题

 

public class NQueen {
    private int queenCount ; 
    private int[] feasible ; 
    private int[] vol={0,0,0,0,0,0,0,0};//保存所在列值,用于将置放皇后所在位置的值置为1
    private long sum ;
    private static int index ; //记录遍历方案序数
    private int[][] location;//皇后所在的位置i,j第i行第j列

    public NQueen(int n){
        sum = 0 ;  //初始化方案数为1,当回溯到最佳方案的时候,就自增1
        queenCount = n ;    //求n皇后问题,由自己定义
        feasible = new int[n+1];  //x[i]表示皇后i放在棋盘的第i行的第x[i]列
        index = 1 ;
        location = new int[n][n];
        for(int i=0;i<queenCount;i++){
        	for(int j=0;j<queenCount;j++)
        		location[i][j]=0;
        }
    }
    
   
    public boolean place (int k){
        for (int j = 1 ; j < k ; j++){
            //皇后所在的位置不可同行,同列,且斜率不为-1或1
            if ( (Math.abs(k - j)) == (Math.abs(feasible[j]-feasible[k])) || (feasible[j] == feasible[k]) ){
                return false; 
            }
        }
        return true ;
    }
   
    public void backTrace (int t){
    	//t大于皇后的数目
        if (t > queenCount){
            sum ++ ;    //可行方案数+1
            System.out.println ("可行方案" + (index++) + "↓");
            output(feasible);
            System.out.println("------------------------------");
        }
        //t小于皇后的数目
        else { 
        	//扩展queenCount个子节点
            for (int i = 1 ; i <= queenCount ; i++){
            	feasible[t] = i ;
                if (place (t)){     //检查子结点的可行性
                    backTrace (t+1);//递归调用
                }
            }
        }
    }
    
   
    public void output (int[] mid){
    	
        for (int i = 1 ; i < mid.length ; i++){
        	vol[i-1] =mid[i];//可放置皇后的列值
        }
        //将皇后所在的位置的值为1
        for(int n=0;n<location.length;n++){
        		location[n][vol[n]-1] = 1;
        }
        
        //输出皇后所在位置的数组,1为皇后所在的位置
        for(int m=0;m<location.length;m++){
        	for(int n=0;n<location[m].length;n++){
        		if(location[m][n] == 1){
        			//删除最后一个','
        			if(n==location.length-1)
        				System.out.print("Q");
        			else
        				System.out.print("Q,");
        		}
        		else{
        			//删除最后一个','
        			if(n==location.length-1)
        				System.out.print("X");
        			else
        				System.out.print("X,");
        		}		
        	}
        	//将皇后所在位置的置置为0,以便下一次数组安排皇后的位置
        	location[m][vol[m]-1] = 0;
        	System.out.println();
        }
    }
    public static void main (String[] args){
    	System.out.println("------------------------------");
        NQueen queen= new NQueen(7);
        queen.backTrace(1);    //从1开始回溯
        System.out.println ("\n综上所述,"+queen.queenCount+"皇后的可行方案个数为:" + queen.sum);
    }
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值