N皇后问题(递归、非递归回溯法;位运算求解N皇后)

目录

N皇后问题

数据范围

分析

C++代码(递归回溯法)

非递归回溯法

C++代码(非递归回溯法)

使用位运算求解N皇后问题

位运算求解N皇后代码


N皇后问题

n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后之间不能相互攻击到彼此,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

现在给定整数 n,请你输出所有的满足条件的棋子摆法,以及一共有多少种能够满足条件的棋子摆法。

数据范围

1<=n<=20

分析

B站上关于N皇后问题的求解视频:

C++代码(递归回溯法)

#include<iostream>

using namespace std;

#define Max 20  //定义棋盘的最大值 
#define MaxCount 1000  //定义最大的结果个数 

int N;

int direction_x[8] = {0, 1, 1, 1, 0, -1, -1, -1}, direction_y[8] = {1, 1, 0, -1, -1, -1, 0, 1};  //控制8个方向 
 
char queen[Max][Max];  //皇后位置棋盘 
int attack[Max][Max];  //皇后可攻击状态棋盘 

char solve[MaxCount][Max][Max];  //存储N皇后问题的全部解法
int solve_count = 0;  //solve数组的第一维 

/* 定义函数put_queen(),实现在(x,y)处放置皇后,对attack数组进行更新 */
void update_attack(int attack[][Max], int x, int y) 
{
	attack[x][y] = 1; //先将皇后所在位置(x,y)处置为1,表示不可再放置皇后 
	int nx,ny;
	//通过两层循环,将该皇后可能攻击到的位置进行标记 
	for(int l=1; l<N; l++)   //从皇后位置向1~N-1个距离延伸 
	{
		for(int k=0; k<8; k++)  //8个方向
		{
			nx = x + l * direction_x[k];
			ny = y + l * direction_y[k];
			if(nx>=0 && nx<N && ny>=0 && ny<N)  //不越界
			{
				attack[nx][ny] = 1;  //可以被皇后攻击 
			}	
		} 	
	}
} 

/*
回溯法求解N皇后的函数
k表示当前处理的行
n表示N皇后问题
queen存储皇后的位置
attack标记皇后的攻击位置
solve存储N皇后问题的全部解法*/
void backtrack(int k, int n, cha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值