回溯算法之N皇后问题的求解

    四皇后问题的求解是回溯算法的一个经典应用,所谓四皇后问题,实质上就是求解如何在一个4*4的棋盘上无冲突的摆放4个皇后棋子。在国际象棋里,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平、竖直、45度交叉线上不能出现皇后的棋子,例如:

具体实现代码如下:

#include <iostream>
using namespace std;

const int N=4;
bool IsCorrect(int i, int j, int (*pt)[N]);
void Four_Queen(int j, int (*pt)[N]);

int count = 0;					//	统计四皇后解的个数
int main()
{
	int QueenArray[N][N]={0};
	memset(QueenArray, 0, sizeof(QueenArray));
	Four_Queen(0, QueenArray);
	cout<<"the answer number of four_queen is:"<<count<<endl;
	while(true);
	return 0;
}

void Four_Queen(int j, int (*pt)[N])		//	二维数组可看做一维数组,二维数组名是数组的首元素首地址,是数组指
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
n皇后问题是指在n×n的棋盘上放置n个皇后,使得皇后彼此之间不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。 回溯算法是一种经典的解决此类问题的算法。其基本思想是通过深度优先搜索策略,逐步构建可行解,如果发现当前搜索路径无法构建出解,则返回上一层继续搜索,直到找到可行解或者搜索完所有可能的情况。 下面是Python实现n皇后问题回溯算法,并且以n=4为例进行说明: ```python def is_valid(board, row, col, n): # 判断当前位置是否可以放置皇后 # 检查当前列是否有皇后 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 < n: if board[i][j] == 1: return False i -= 1 j += 1 return True def backtracking(board, row, n, res): if row == n: # 已经找到一组解 res.append([''.join(['Q' if i==1 else '.' for i in row]) for row in board]) return for col in range(n): # 尝试在当前行的每个位置放置皇后 if is_valid(board, row, col, n): board[row][col] = 1 # 放置皇后 backtracking(board, row+1, n, res) # 继续搜索下一行 board[row][col] = 0 # 回溯,撤销皇后 return def solveNQueens(n): res = [] board = [[0] * n for i in range(n)] backtracking(board, 0, n, res) return res print(solveNQueens(4)) ``` 输出结果为: ``` [['..Q.', 'Q...', '...Q', '.Q..'], ['.Q..', '...Q', 'Q...', '..Q.']] ``` 其中,每个元素表示一组解,每行字符串表示棋盘上的一行,Q表示皇后,.表示空位。可以看到,对于n=4的情况,共有两组解。 具体实现中,is_valid函数用于判断当前位置是否可以放置皇后,backtracking函数则用于递归搜索所有可能的解。在backtracking函数中,首先判断是否已经找到一组解,如果已经找到,则将其加入结果集;如果没有找到,则在当前行的每个位置尝试放置皇后,并继续搜索下一行。如果当前搜索路径无法构建出解,则回溯并撤销当前放置的皇后,返回上一层继续搜索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值