"八皇后"问题的解法(1)

最近准备整理5种常见的"八皇后"问题的解法,这是第一篇,用递归方法求解。

简单介绍下"八皇后"问题:如何在8*8棋盘上无冲突放置8个皇后,无冲突可按如下理解(1)任何水平或竖直方向不能再有其他皇后;(2)正负45‘方向不能再有皇后;

源代码如下:

/*
2015.5.21 by HanChun
http://blog.csdn.net/code_7 
*/

public class Queen {
	private static int count = 0;   //记录解的个数

	public static void main(String[] args) {
		int[][] chessboard1 = new int[8][8];
		//初始化棋盘
		for(int i=0; i<8; i++){
			for(int j=0; j<8; j++){
				chessboard1[i][j] = 0;
			}
		}
		solveQue(0, 8, chessboard1);
		System.out.println("八皇后解的个数为:" + count);
		
	}
	
	public static int solveQue(int row, int col, int[][] chessboard){
		int[][] chessboard2 = new int[8][8];
		//复制chessboard留做后面递归使用
		for(int i=0; i<8; i++){
			for(int j=0; j<8; j++){
				chessboard2[i][j] = chessboard[i][j];
			}
		}
		if(row==8){
			System.out.println("这是第" + (count+1) + "种解法");
			for(int i=0; i<chessboard2.length; i++){
				for(int j=0; j<chessboard2[i].length; j++ ){
					System.out.print(chessboard[i][j] + " ");
				}
				System.out.println();
			}
			count++;
		}else{
			for(int j=0; j<col; j++){
				if(!isPlaced(row, j, chessboard)){
					for(int k=0; k<8; k++){
						chessboard2[row][k] = 0;
					}
					chessboard2[row][j] = 1;
					solveQue(row+1, col, chessboard2);
				}
			}
		}
		return count;	
	}
	
	public static boolean isPlaced(int row, int col, int[][] chessboard){
		boolean flag1=false, flag2=false, flag3=false, flag4=false, flag5=false;
		//检查列是否有冲突
		for(int i=0; i<8; i++){
			if(chessboard[i][col] == 1){
				flag1 = true;
				break;
			}
		}
		//检查左上是否有冲突
		for(int i=row, j=col; i>=0 && j>=0; i--,j--){
			if(chessboard[i][j] == 1){
				flag2 = true;
				break;
			}
		}
		//检查右上是否冲突
		for(int i=row, j=col; i>=0 && j<8; i--,j++ ){
			if(chessboard[i][j] == 1){
				flag3 = true;
				break;
			}
		}
		//检查右下是否有
		for(int i=row, j=col; i<8 && j<8; i++,j++ ){
			if(chessboard[i][j] == 1){
				flag4 = true;
				break;
			}
		}
		//检查左下是否有冲突
		for(int i=row, j=col; i<=0 && j>=0; i++,j-- ){
			if(chessboard[i][j] == 1){
				flag5 = true;
				break;
			}
		}
		if(flag1||flag2||flag3||flag4||flag5){
			return true;
		}
		return false;
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
八皇后问题一个经典的算法问题,目标是在一个8x8的棋盘上放置8个皇后,使得它们互相之间不能相互攻击。这里给出一种常见的解法,使用回溯算法实现: 1. 创建一个8x8的二维数组作为棋盘,初始化所有元素为0,表示空格。 2. 从第一行开始,逐行放置皇后。对于每一行,从左到右遍历每个列,尝试将皇后放置在当前位置。 3. 如果当前位置可以放置皇后(即不会与已经放置的皇后相互攻击),将当前位置标记为1,并进入下一行。 4. 如果当前位置无法放置皇后,则回溯到上一行,继续尝试下一个列。 5. 当所有皇后都放置完毕时,得到一个。可以将存储起来或进行其他操作。 6. 继续回溯,寻找其他解法。 下面是一个简单的示例代码: ```python def is_safe(board, row, col): # 检查当前位置是否与已经放置的皇后冲突 # 检查列 for i in range(row): if board[i][col] == 1: return False # 检查左上方对角线 i, j = row - 1, col - 1 while i >= 0 and j >= 0: if board[i][j] == 1: return False i -= 1 j -= 1 # 检查右上方对角线 i, j = row - 1, col + 1 while i >= 0 and j < 8: if board[i][j] == 1: return False i -= 1 j += 1 return True def solve_n_queens(): board = [[0] * 8 for _ in range(8)] solutions = [] def backtrack(row): if row == 8: # 找到一个,将棋盘状态添加到结果列表中 solutions.append([row[:] for row in board]) return for col in range(8): if is_safe(board, row, col): board[row][col] = 1 # 放置皇后 backtrack(row + 1) # 继续下一行 board[row][col] = 0 # 撤销放置的皇后 backtrack(0) return solutions # 调用函数并打印所有解法 solutions = solve_n_queens() for solution in solutions: for row in solution: print(row) print() ``` 这段代码会输出所有的八皇后问题解法,每个解法一个8x8的棋盘,其中1表示皇后的位置,0表示空格。希望这可以帮助到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值