关于N皇后问题的求解C++

关于N皇后的问题求解,我采用的是回溯法,在这里以4皇后问题为例。

4皇后即任意四个皇后都不能处于同一行,同一列或同一条斜线

回溯过程分析:

1.从空棋盘起,逐行放置棋子

2.每在一个布局中放下一个棋子,即推演到一个新的布局

3.如果当前行上没有可合法放置棋子的位置,则回溯到上一行,重新布放上一行的棋子

数据结构分析:

二维数组A[N][N]存储皇后位置(若第i行,第j列放有皇后,则其为非零值,否则为0)

一维数组M[N],L[2*N],R[2*N]分别表示竖列,左斜线,右斜线是否放有皇后,有则为1,无则为0

 

 

 

 

 

 

 

 

源代码如下:

#include<iostream>
using namespace std;
int count=0;
const int N=4;
void print(int A[N][N]){
	int ii,jj;
	for(ii=0;ii<N;ii++){
		for(jj=0;jj<N;jj++)
		{cout<<A[ii][jj];}
		cout<<endl;
	}
	cout<<endl;
}

int solve(int i,int M[N],int L[2*N],int R[2*N],int A[N][N]){
	int j;
	for(j=0;j<N;j++){
		if(!M[j] && !L[i+j] && !R[i-j+N]){
			A[i][j]=i+1;
			M[j]=L[i+j]=R[i-j+N]=1;
			if(i==N-1){
				print(A);
				cout<<endl;
				count++;
			}
			else solve(i+1,M,L,R,A);
			A[i][j]=0;
			M[j]=L[i+j]=R[i-j+N]=0;
		}
	}
	return count;
} 


int main(){
	int N=4;
	int A[4][4];
	int M[4];
	int L[8];
	int R[8];
	int a,b;
	for(a=0;a<N;a++){
		for(b=0;b<N;b++)
		A[a][b]=0;
	M[a]=0;
	}
	for(a=0;a<2*N;a++){
		L[a]=0;
		R[a]=0;
	}
	count=solve(0,M,L,R,A);
	cout<<count<<endl;
	return 0;
}

小白第一次发文章,有啥不足请大佬多多指正

文中图片截取自湖南中医药大学刘伟老师智慧树的课件(如侵立删)

谢谢!!!

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
n皇后问题是一道经典的回溯算法问题,以下是C++的实现代码: ``` #include <iostream> #include <vector> using namespace std; // 判断当前位置是否可以放置皇后 bool is_valid(vector<int>& queens, int row, int col) { for(int i = 0; i < row; i++) { if(queens[i] == col || abs(row - i) == abs(col - queens[i])) { return false; } } return true; } // 递归回溯求解n皇后问题 void backtrack(vector<vector<string>>& res, vector<int>& queens, int row, int n) { if(row == n) { vector<string> solution(n, string(n, '.')); for(int i = 0; i < n; i++) { solution[i][queens[i]] = 'Q'; } res.push_back(solution); } else { for(int col = 0; col < n; col++) { if(is_valid(queens, row, col)) { queens[row] = col; backtrack(res, queens, row + 1, n); queens[row] = -1; } } } } vector<vector<string>> solveNQueens(int n) { vector<vector<string>> res; vector<int> queens(n, -1); backtrack(res, queens, 0, n); return res; } int main() { int n = 4; vector<vector<string>> res = solveNQueens(n); for(int i = 0; i < res.size(); i++) { for(int j = 0; j < res[i].size(); j++) { cout << res[i][j] << endl; } cout << endl; } return 0; } ``` 代码思路: 1. 递归函数 backtrack 用于求解 n 皇后问题,参数 res 表示最终结果,queens 表示每一行皇后所在的列号,row 表示当前处理的行号,n 表示总行数。 2. 判断当前位置是否可以放置皇后的函数 is_valid,用于判断当前位置是否会受到之前皇后的攻击,如果是则返回 false。 3. 在 backtrack 函数中,先判断是否已经处理完了所有行,如果是则将结果加入到 res 中,否则枚举当前行的所有列,如果当前位置可以放置皇后,则继续处理下一行。 4. 主函数中调用 solveNQueens 函数求解 n 皇后问题,并输出结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值