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

作者:是八阿哥不是bug 时间:2021-11-12 03:27:15 

八皇后问题(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语言回溯法解八皇后问题(八皇后算法)

八皇后

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

来源:https://blog.csdn.net/qq_51462776/article/details/122162381

标签:C语言,八皇后,算法
0
投稿

猜你喜欢

  • SpringMVC数据输出相关知识总结

    2022-04-06 10:35:06
  • Java ArrayList扩容问题实例详解

    2022-05-08 08:57:57
  • C# pictureBox用法案例详解

    2022-02-24 19:40:07
  • 一篇文章带你了解java接口与继承

    2022-07-15 02:44:08
  • C#实现求一组数据众数的方法

    2023-06-07 00:11:53
  • 解决pageHelper分页失效以及如何配置问题

    2022-03-15 06:45:44
  • 如何用Dos命令运行Java版HelloWorld你知道吗

    2022-07-24 22:32:26
  • Android使用GridView实现日历的简单功能

    2023-10-07 07:14:31
  • C#中异步Socket通信编程代码实例

    2022-02-23 11:29:59
  • Java使用HttpUtils实现发送HTTP请求

    2021-06-11 07:08:39
  • 浅谈@Aspect@Order各个通知的执行顺序

    2021-10-24 19:00:38
  • C# HttpClient 如何使用 Consul 发现服务

    2021-09-28 01:06:18
  • 协定需要会话,但是绑定“BasicHttpBinding”不支持它或者因配置不正确而无法支持它

    2023-03-17 16:44:34
  • c#多线程中Lock()关键字的用法小结

    2022-07-08 04:33:27
  • Unity实现简易日志输出功能

    2023-07-25 22:59:44
  • Android自定义View绘图实现拖影动画

    2023-04-16 00:06:38
  • activemq整合springboot使用方法(个人微信小程序用)

    2023-07-08 22:29:55
  • SpringBoot导入Druid运行失败问题

    2023-02-14 03:35:41
  • C#实现截图工具小项目

    2023-10-02 08:20:03
  • android: targetSdkVersion升级中Only fullscreen activities can request orientation问题的解决方法

    2023-07-26 13:56:08
  • asp之家 软件编程 m.aspxhome.com