第1次实验——NPC问题(回溯算法、聚类分析)

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。由此可延伸到N皇后问题。

Java实现如下:

package queen;

import java.util.Scanner;

public class Queen {
    public static int num = 0; //累计方案总数
    public static final int MAXQUEEN = QueenNum();//皇后个数,同时也是棋盘行列总数
    public static int[] cols = new int[MAXQUEEN]; //定义cols数组,表示8列棋子摆放情况
    
    public static int QueenNum(){    //自定义皇后个数
    	int q;
    	System.out.println("请输入皇后的数量(≥4)");
    	Scanner a = new Scanner(System.in);
    	q = a.nextInt();
    	return q;
    }
    public Queen() {    	
    	System.out.println("前三种解法如下所示:");
       //核心函数
    	getArrangement(0);
    	System.out.println(" ");
    	System.out.println(MAXQUEEN+"皇后问题有"+num+"种摆放方法。");
    }
    
    public void  getArrangement(int n){
     //遍历该列所有不合法的行,并用rows数组记录,不合法即rows[i]=true
     boolean[] rows = new boolean[MAXQUEEN];
     for(int i=0;i<n;i++){
        rows[cols[i]]=true;
        int d = n-i;
        if(cols[i]-d >= 0)rows[cols[i]-d]=true;
        if(cols[i]+d <= MAXQUEEN-1)rows[cols[i]+d]=true; 
      
     }
     for(int i=0;i<MAXQUEEN;i++){
       //判断该行是否合法  
       if(rows[i])continue;
       //设置当前列合法棋子所在行数
       cols[n] = i;
       //当前列不为最后一列时
       if(n<MAXQUEEN-1){
         getArrangement(n+1);
       }else{

        //累计方案个数
         num++;
         //打印前三种棋盘信息         
         if(num<=3){
         printChessBoard();
         }
       } 
      
      
     }
     
    }
    public void printChessBoard(){
       
       System.out.println("第"+num+"种走法 ");
       
       for(int i=0;i<MAXQUEEN;i++){
         for(int j=0;j<MAXQUEEN;j++){
           if(i==cols[j]){
             System.out.print("Q ");
           }else
             System.out.print("X ");
         }
         
         System.out.println(" ");
       }
       
    }
    public static void main(String args[]){
      Queen queen = new Queen();
    }
   
}<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);"> </span>

运行结果:

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值