C语言回溯法解八皇后问题(八皇后算法)
作者:是八阿哥不是bug 发布时间:2021-11-12 03:27:15
标签:C语言,八皇后,算法
八皇后问题(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;
}
四、测试结果
四皇后
八皇后
来源:https://blog.csdn.net/qq_51462776/article/details/122162381


猜你喜欢
- 本文实例讲述了C#处理Access中事务的方法。分享给大家供大家参考。具体如下:Access不能像SQL server一样直接执行多条语句,
- 本文实例讲述了Android编程实现canvas绘制饼状统计图功能。分享给大家供大家参考,具体如下:本例的目的是实现一个简单的饼状统计图,效
- 前言: Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版。在Java Code Geeks上已经有很多介绍
- 把验证码存储在Cookie中一般来说,我们会把验证码的值用Session存储起来,通过对比用户提交的验证码和Session中的验证码,就可以
- 具体详细介绍请看下文:在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择。本文使用Apache Jakarta Common
- 一、File --> new -->project二、构建maven项目。三、创建项目名,报名,项目路径。四、选择好maven仓
- 像javascript中有eval()来执行动态代码,c#中是没有的,于是自己动手丰衣足食,先来代码using System;using S
- 本文实例汇总了C#常用GDI+文字操作,包含了文字的投影、倒影、旋转等常见的效果,在进行C#应用程序开发中有不错的实用价值。分享给大家供大家
- 最近在用SpringMvc写项目的时候,遇到一个问题,就是方法的鉴权问题,这个问题弄了一天了终于解决了,下面看下解决方法项目需求:需要鉴权的
- 大家都知道为了防止我们的网站被有些人和黑客恶意攻击,比如我们网站的注册页面,如果我们在用户注册的时候不加上一个验证码框的话,别人就可以写一个
- Thread parameterThread_t = null; private void Print_DetailForm_S
- 参考视频:https://www.bilibili.com/video/BV1Bq4y1Q7GZ?p=4通过视频的学习和自身的理解整理出的笔
- 项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发概述要使用@Scheduled注解,
- 从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运
- 本文实例为大家分享了C#实现网页画图的具体代码,供大家参考,具体内容如下代码贴着保存下using System;using System.C
- 前言;Maven 作为经典的项目构建工具相信很多人已经用很久了,但如果体验过 Gradle,那感觉只有两个字“真香&am
- 题目描述这是 LeetCode 上的 768. 最多能完成排序的块 II ,难度为 困难。Tag : 「贪心」这个问题和&ldquo
- 一 点睛注解若想发挥更大作用,还需借助反射机制之力。通过反射,可以取得一个方法上声明的注解的全部内容。一般有两种需求:1 
- 拿到了项目框架工程代码却没有uml图,那么方法之间的调用关系功能流转就不容易看出来,那么如何产生类图呢,记忆里方法有下:1.rose逆向工程
- 本文实例讲述了C#中lock的用法。分享给大家供大家参考。具体分析如下:lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这