N皇后问题:在 n * n 的棋盘上要摆 n 个皇后,要求:任何两个皇后不同行,不同列也不在同一条斜线上,求给一个整数 n ,返回 n 皇后的摆法数。
1.非递归调用:
#include <iostream>
#include <math.h>
#define N 8
using namespace std;
int q[N + 1]; //q[i]表示第i个皇后在第i行上的第q[i]列
int check(int j) { //检查N皇后摆放的位置是否合法
for (int i = 1; i < j; i++) {
if (q[i] == q[j] || abs(i-j)==abs(q[i]-q[j])) { //判断是否在同一列或同一斜线上
return 0;
}
}
return 1;
}
void queen() {
for (int i = 1; i <= N; i++) {
q[i] = 0;//初始化
}
int answer = 0;//方案数
int j = 1; //表示正在摆放第j个皇后
while (j >= 1) {
q[j]++; //让第j个皇后向后一列摆放
while (q[j]<=N && !check(j)) {//判断第j个皇后的位置是否合法
q[j]++; //不合法就往后一个位置摆放
}
if (q[j] <= N) { //表示第j个皇后找到一个合法的摆放位置
if (j == N) {//找到了N皇后的一组解
answer++;
cout << "方案" << answer << ":";
for (int i = 1; i <= N; i++) {
cout << q[i] << " ";
}
cout << endl;
}
else {
j++;//继续摆放下一个皇后
}
}
else {//表示第j个皇后找不到一个合法的摆放位置
q[j] = 0;//还原第j个皇后的位置
j--;//回溯
}
}
}
int main() {
queen();
system("pause");
return 0;
}
2.递归调用:
#include <iostream>
#include <math.h>
#define N 8
using namespace std;
int answer = 0;//方案数
int q[N + 1]; //q[i]表示第i个皇后在第i行上的第q[i]列
int check(int j) { //检查N皇后摆放的位置是否合法
for (int i = 1; i < j; i++) {
if (q[i] == q[j] || abs(i-j)==abs(q[i]-q[j])) { //判断是否在同一列或同一斜线上
return 0;
}
}
return 1;
}
void queen(int j) {
for (int i = 1; i <= N; i++) {
q[j] = i;
if (check(j)) { //当摆放的皇后位置合法时
if (j == N) { //找到了N皇后的一组解
answer++;
cout << "方案" << answer << ":";
for (int i = 1; i <= N; i++) {
cout << q[i] << " ";
}
cout << endl;
}
else {
queen(j+1);//递归摆放下一个皇后的位置
}
}
}
}
int main() {
queen(1);
system("pause");
return 0;
}
分类:
数据结构(C语言描述)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探