广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言回溯法解八皇后问题(八皇后算法)
  • 137
分享到

C语言回溯法解八皇后问题(八皇后算法)

2024-04-02 19:04:59 137人浏览 泡泡鱼
摘要

八皇后问题(N皇后问题)的回溯法求解 一、问题描述 在一个国际象棋棋盘上放置八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法,并推广到N皇后情况。 二、参考资料 啥文字都

八皇后问题(N皇后问题)的回溯法求解

一、问题描述

在一个国际象棋棋盘上放置八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法,并推广到N皇后情况。

二、参考资料

啥文字都不用看,B站上有个非常详细的动画视频解说,上链接!!!

Click Here!

三、源代码


#include<iOStream>
#include<vector>
#include<string>
using namespace std;

void put_queen(int x, int y, vector<vector<int>>&attack)
{//实现在(x,y)放置皇后,对attack数组更新,xy表示放置皇后的坐标,attack表示是否可以放置皇后
	//方向数组,方便后面对8个方向进行标记
	static const int dx[] = { -1,-1,-1,0,0,1,1,1 };
	static const int dy[] = { -1,0,1,-1,1,-1,0,1 };
	attack[x][y] = 1;//将皇后位置标记为1
	//通过两层for循环,将该皇后可能攻击到的位置标记
	for (int i = 1; i < attack.size(); i++)//从皇后位置向1到n-1个距离延伸
	{
		for (int j = 0; j < 8; j++)//遍历8个方向
		{
			int nx = x + i * dx[j];//生成的新位置行
			int ny = y + i * dy[j];//生成的新位置列
			//在棋盘范围内
			if (nx >= 0 && nx < attack.size() && ny >= 0 && ny < attack.size())
				attack[nx][ny] = 1;//标记为1
		}
	}
}

//回溯算法
//k表示当前处理的行
//n表示n皇后问题
//queen存储皇后的位置
//attack标记皇后的攻击范围
//solve存储N皇后的全部解法
void backtrack(int k, int n, vector<string>& queen,
	vector<vector<int>>& attack,
	vector<vector<string>>& solve)
{
	if (k == n)//找到一组解
	{
		solve.push_back(queen);//将结果queen存储至solve
		return;
	}
	//遍历0至n-1列,在循环中,回溯试探皇后可放置的位置
	for (int i = 0; i < n; i++)
	{
		if (attack[k][i] == 0)//判断当前k行第i列是否可以放置皇后
		{
			vector<vector<int>> tmp = attack;//备份attack数组
			queen[k][i] = 'Q';//标记该位置为Q
			put_queen(k, i, attack);//更新attack数组
			backtrack(k + 1, n, queen, attack, solve);//递归试探k+1行的皇后的位置
			attack = tmp;//恢复attack数组
			queen[k][i] = '.';//恢复queen数组
		}
	}
}

vector<vector<string>>solveNQueens(int n)
{//string存储具体的摆放位置,<vector<string>>存放一种解法,二维vector存放全部解法
	vector<vector<string>>solve;//存储最后结果
	vector<vector<int>>attack;//标记皇后的攻击位
	vector<string>queen;//保存皇后位置
	//使用循环初始化attack和queen数组
	for (int i = 0; i < n; i++)
	{
		attack.push_back((vector<int>()));
		for (int j = 0; j < n; j++)
		{
			attack[i].push_back(0);
		}
		queen.push_back("");
		queen[i].append(n, '.');
	}
	backtrack(0, n, queen, attack, solve);
	return solve;//返回结果数组
}

int main()
{
	//int num;
	//cin >> num;//输入皇后数
	初始化attack数组
	//vector<vector<int>> attack(num,vector<int>(num, 0));
	初始化queen数组
	//string s;
	//for (int i = 0; i < num; i++)s += '.';
	//vector<string> queen(num, s);
	int n;
	cin >> n;
	vector<vector<string>>result;
	result = solveNQueens(n);
	cout << n << "皇后共有" << result.size() << "种解法" << endl;
	for (int i = 0; i < result.size(); i++)
	{
		cout << "解法" << i + 1 << ":" << endl;
		for (int j = 0; j < result[i].size(); j++)
		{
			cout << result[i][j] << endl;
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

四、测试结果

四皇后

八皇后

到此这篇关于C语言回溯法解八皇后问题的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C语言回溯法解八皇后问题(八皇后算法)

本文链接: https://www.lsjlt.com/news/161009.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言回溯法解八皇后问题(八皇后算法)
    八皇后问题(N皇后问题)的回溯法求解 一、问题描述 在一个国际象棋棋盘上放置八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法,并推广到N皇后情况。 二、参考资料 啥文字都...
    99+
    2022-11-12
  • C语言如何使用回溯法解八皇后问题
    这篇文章给大家分享的是有关C语言如何使用回溯法解八皇后问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。八皇后问题(N皇后问题)的回溯法求解一、问题描述在一个国际象棋棋盘上放置八个皇后,使得任何两个皇后之间不相互...
    99+
    2023-06-22
  • 浅谈Java实现回溯算法之八皇后问题
    目录一、前言二、浅谈递归三、回溯算法四、八皇后问题五、八皇后变种六、总结一、前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最...
    99+
    2022-11-12
  • 如何使用C语言解决八皇后问题
    这篇文章主要讲解了“如何使用C语言解决八皇后问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用C语言解决八皇后问题”吧!前言八皇后问题是一个古老而著名的问题。该问题是19世纪著名的数...
    99+
    2023-06-08
  • Java基于循环递归回溯实现八皇后问题算法示例
    本文实例讲述了Java基于循环递归回溯实现八皇后问题。分享给大家供大家参考,具体如下:运行效果图如下:棋盘接口public interface Piece { abstract boolean isRow(int line); abst...
    99+
    2023-05-31
    java 八皇后 算法
  • Java使用递归回溯完美解决八皇后的问题
    八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:...
    99+
    2022-11-12
  • 怎么使用Java递归回溯解决八皇后的问题
    这篇文章主要介绍“怎么使用Java递归回溯解决八皇后的问题”,在日常操作中,相信很多人在怎么使用Java递归回溯解决八皇后的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Java递归回溯解决八皇后...
    99+
    2023-06-25
  • Java通过递归算法解决迷宫与汉诺塔及八皇后问题
    目录1.递归的重要规则2.递归的三个案例1.老鼠出迷宫2.汉诺塔3.八皇后1.递归的重要规则 在执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。方法的局部变量时独立的,不会...
    99+
    2022-11-13
  • Java怎么通过递归算法解决迷宫与汉诺塔及八皇后问题
    本篇内容介绍了“Java怎么通过递归算法解决迷宫与汉诺塔及八皇后问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.递归的重要规则在执行一...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作