八皇后问题

package datasystem;
/**  
* 描述:在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。
* 
*  对8 x 8的二维数组上的某点a[i][j](0<=i,j<=7)
* 如果a[s][q]满足|s-i|=|q-j|,a[s][q]在a[i][j]的对角线上。
*  如果s=i,则a[s][q]在a[i][j]的同一列上。
*  
*  每行有且仅有一个皇后:
*  声明数组Queen[8] 存放皇后位置//Queen[n]数组的含义为将第n个皇后放在格子的(n,Queen[n])位置
public static int Place(int n)//判断(n,Queen[n])位置是否可以放皇后


*  
*  
* @author ASUS  
* @date 2018年6月16日
*/
public class EightQueens {
	 //皇后的个数
	private static  int Max=8; 
	//Queen[n]数组的含义为将第n个皇后放在格子的(n,Queen[n])位置
	private static int []Queen=new int[Max];
	//记录总计有多种放置方式
	private static int count=0;   
	//判断(n,Queen[n])位置是否可以放皇后
	public static boolean Place(int n) {
	       int i;
	       for(i=0;i<n;i++) {
	    	   //Math.abs(Queen[n]-Queen[i])==n-i)判断对角线上是否有皇后
	    	   //Queen[i]==Queen[n]判断同一列是否有皇后
	              if(Queen[i]==Queen[n]||Math.abs(Queen[n]-Queen[i])==n-i)//判断是否在同一列或者对角线上
	            	//同一列或者对角线上有皇后时该位置不能放皇后                                           
	              return false;
	       }
	//可以放皇后    
	return true;
	}
	//放置第n行的皇后
	public static void NQueen(int n) {
	
	      int i=0;
	      for(i=0;i<Max;i++) {
	        Queen[n] = i;
	        if(Place(n)==true){
	        	  //八个皇后全部放完
	              if(n==Max-1)  {
	              //输出八个皇后的位置
	              Show();
	              //一次放置完换行
	              System.out.println();
	              //放置方式加一
	              count++;  
	              }else{
	               //放置下一行的皇后
	              NQueen(n+1);  
	              }
           	}
	    }
	}
	public static void Show() {
	       for(int i=0;i<Max;i++) {
	          System.out.print("("+i+","+Queen[i]+")");
	      }
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		NQueen(0);            //初始放置第一行的皇后
		System.out.print("共有"+count+"种方式");
		
	}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值