递归实现八皇后并生成皇后位置图

记录一下解决八皇后问题的代码

1.枚举类型

#include<string>
#include<iostream>
using namespace std;
static int mapsize;
static int Queensize;
#define max 50
static int x[max + 1];
static int sum = 0;

typedef enum{unknown,wrong,wall,Right}status;

2.声明皇后类

struct Queen {//皇后类(重载运算符可忽略,是尝试用栈解决的部分)
	int x, y;
	status status;
	//Queen(int xx = 0, int yy = 0) :x(xx), y(yy) {};//构造函数,对坐标(x,y)初始化
	bool operator==(Queen const& q) {//重载运算符==
	    return(x == q.x) || (y == q.y) || (x + y == q.x + q.y) || (x - y == q.x - q.y);
    }
    bool operator!=(Queen & q1) { return!(*this == q1); }//重载运算符!=
};

#define max_size 20
static Queen map[max_size][max_size];//格子

3.对皇后图初始化

void transition(int q) {//对所有皇后图的格位初始化
	void initialize(int i, int j);
	for (int i = 0; i <= q; i++)
		for (int j = 0; j <= q; j++) {
			if (i == 0 || j == 0 || i == q - 1 || j == q - 1)
				map[i][j].status = wall;
			else map[i][j].status = unknown;
		}
}

4.依次检查两个皇后相互是否安全

bool Place(int row,int col) {//依次检查两个皇后是否相互安全
	for (int i = 1; i < row; i++) {
		if (col == x[i] || abs(row - i) == abs(col - x[i]))
			return false;
	}
	return true;
}

5.递归实现回溯

void backtrack(int t, int n) {//递归实现回溯
	void display(int n);
	if (t == n + 1){
		sum++;
		for (int a = 0; a < t-1; a++) {
			map[a+1][x[a+1]].status = Right;	
		}
		display(mapsize);
		for (int a = 0; a < t-1; a++) {
			map[a+1][x[a+1]].status = unknown;
		}
	}
	else {
		for (int i = 1; i <= n; i++) {
			x[t] = i;
			if (Place(t, x[t]))
				backtrack(t + 1, n);
		}
	}
}

6.结果展示

void display(int n) {
	if (sum != 0) {
        cout << "第" << sum << "种方法:" << endl;
	}
	for(int i=0;i<n;i++){
		for (int j = 0; j < n; j++)
		{
			switch (map[i][j].status) {
			case unknown:cout << "  "; break;
			case wrong:cout << "×"; break;
			case wall:cout << "■"; break;
			case Right:cout << "○"; break;
			default:break;
			}	
		}
		cout << endl;
	}
	cout << "共计" << sum << "种方法!" << endl;
}

7.输出结果(placequeen是我用于栈的算法)

void placeQueens(int n) {//n皇后算法(递归法)
	//stack<Queen>solu;
	//static int ii=1, jj=1;
	//map[ii][jj].x = map[ii][jj].y = 1;
	backtrack(1, n - 1);
}
int main() {
	//placeQueens(4);
	cout << "*********解决n皇后的问题:***********" << endl;
	cout << "输入n的值:";
	cin>> Queensize;;
	mapsize= Queensize+2;
	cout << "输出原始皇后图:" << endl;
	transition(mapsize);//模块成功
	//initialize(6,6);
	display(mapsize);
	cout << "输出问题解决图:" << endl;
	placeQueens(mapsize-1);
	return 0;
}

8.完毕
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值