C语言如何使用回溯法解八皇后问题
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章给大家分享的是有关C语言如何使用回溯法解八皇后问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。八皇后问题(N皇后问题)的回溯法求解一、问题描述在一个国际象棋棋盘上
千家信息网最后更新 2026年11月04日C语言如何使用回溯法解八皇后问题
这篇文章给大家分享的是有关C语言如何使用回溯法解八皇后问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
八皇后问题(N皇后问题)的回溯法求解
一、问题描述
在一个国际象棋棋盘上放置八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法,并推广到N皇后情况。
二、源代码
#include#include #include using namespace std;void put_queen(int x, int y, vector >&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 & queen, vector >& attack, vector >& 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 > 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 >solveNQueens(int n){//string存储具体的摆放位置, >存放一种解法,二维vector存放全部解法 vector >solve;//存储最后结果 vector >attack;//标记皇后的攻击位 vector queen;//保存皇后位置 //使用循环初始化attack和queen数组 for (int i = 0; i < n; i++) { attack.push_back((vector ())); 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 > attack(num,vector (num, 0)); 初始化queen数组 //string s; //for (int i = 0; i < num; i++)s += '.'; //vector queen(num, s); int n; cin >> n; vector >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语言如何使用回溯法解八皇后问题"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
皇后
位置
数组
标记
问题
解法
存储
攻击
结果
循环
语言
内容
方向
更多
篇文章
更新
不错
实用
两个
之间
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
咖啡豆
上海睿民互联网科技有限公司
广州淘业互联网络科技
华服互联网科技怎么样
互联网科技工作委员会主任
致骋互联网科技
互联网科技论文
融贸通互联网科技
互联网金融 科技创新
互联网科技类展会
中正互联网科技招聘
哈尔滨秒房互联网科技有限公司
西藏七维空间互联网科技有限公司
福州新华互联网科技学校 知乎
南山科技园互联网公司有哪些
互联网科技有哪些公司
抖集互联网科技技术咨询
北京天晋互联网科技有限公司
亚光科技低轨卫星互联网
株洲百竞科技的互联网营销顾问
远拓互联网科技
北京禾田雨橡互联网科技
顺网科技2021年互联网排名
哈尔滨秒房互联网科技有限公司
新华互联网科技2019
阿里互联网科技公司
米聚互联网科技南京有限公司排面
互联网科技如何创业
伊宁互联网科技做什么的
下一代互联网重大应用科技园