八皇后问题(递归)

八皇后问题(递归)
如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行纵行斜线上。
在这里插入图片描述

/*
 * 8*8的棋盘方格
 * 每一行的某一列上要有一个皇后
 * */
public class EightQueen {
	public static int count=0;
	
	public static boolean noDanger(int row,int col,int chess[][]) {	
		
		//这一列
		for(int i=0;i<8;i++) {
			if(chess[i][col]==1)
				return false;
		}
		
		//左上方
		for(int i=1;row-i>=0&&col-i>=0;i++) {
			if(chess[row-i][col-i]==1)
				return false;
		}
		
		//左下方
		for(int i=1;row+i<8&&col-i>=0;i++) {
			if(chess[row+i][col-i]==1)
				return false;
		}
		
		//右上方
		for(int i=1;row-i>=0&&col+i<8;i++) {
			if(chess[row-i][col+i]==1)
				return false;
		}
		
		//右下方
		for(int i=1;row+i<8&&col+i<8;i++) {
			if(chess[row+i][col+i]==1)
				return false;
		}
		
		return true;
	}


	public static void EQueen(int row,int col,int chess[][]) {
		//当前棋盘的复制
		int chess2[][];
		chess2 = chess.clone();
		
		//if判断是否八行部排好了,true:打印出棋盘
		if(row == 8) {
			count++;
			System.out.println("第"+count+"种");
			for(int i=0;i<row;i++) {
				for(int j=0;j<col;j++) {
					System.out.print(chess2[i][j]+" ");
				}
				System.out.println();
			}
		}
		//else 在当前行中进行尝试出符合的列然后进行递归调用
		else{
			//有一个for循环当前行中的所有列
			for(int j=0;j<col;j++) {
				//有一个if判断可行列,需要一个函数,true:将这一格填为1,行加1然后进行调用
				if(noDanger(row,j,chess2)) {
					chess2[row][j] = 1;
					EQueen(row+1,col,chess2);
				}
				//回退后,将原来这一行的这一列的1置为0;
				chess2[row][j] = 0;
			}
			
		}
			
		
		
	}

	public static void main(String[] args) {
		int chess[][] = new int[8][8];
		
		EQueen(0,8,chess);

	}

}

noDanger函数中的判断斜线的另一种方式:

		int plus = row+col; //右下划线,第每个点的row+col都相等
		int minus = row-col; //左下划线,第每个点的row-col都相等
		
		for(int i=0;i<8;i++) {
			for(int j=0;j<8;j++) {
				if(i+j==plus&&chess[i][j]==1)
					return false;
				if(i-j==minus&&chess[i][j]==1)
					return false;
			}
		}
		
		return true;

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值