回溯法-N皇后问题-C++算法
- N皇后问题要求:
在一个N×N的矩阵中,任意两个皇后不能同行、不能同列或不能位于同一条对角线上。
- 算法思路:
按照每一行对单个皇后位置进行遍历,此时限制条件转变为了不能同列或不能位于同一条对角线。
以此为限制条件实现回溯,当满足达到最后一行时输出当前结果。
- 代码实现:
#include <iostream>
using namespace std;
void Select(int **pos, int n, int num);
int main (){
int num; //皇后数
cin >> num;
int **pos; //皇后摆放矩阵
pos = new int *[num];
for(int i =0; i<num; i++){
pos[i] = new int [num];
for(int j =0; j<num; j++)
pos[i][j]= 0;
}
Select(pos,1,num);
}
void Select(int **pos, int n, int num){
if(n<=num){
for(int i = 0; i<num; i++){ //每一行进行遍历
bool flag = false;
for(int j = 1; j<n; j++){
if(pos[n-1-j][i] || ((i-j>=0)&&(pos[n-1-j][i-j])) || (i+j<num)&&(pos[n-1-j][i+j])){ //回溯条件,判断同一列 ||左上方 ||右上方
flag = true;
break;
}
}
if(!flag && n==num){ //最后一行输出结果
pos[n-1][i] = 1;
for(int i = 0; i<num; i++){
for(int j = 0; j<num; j++){
cout << pos[i][j] << " ";
}
cout <<endl;
}
cout <<endl;
pos[n-1][i] = 0;
return;
}
if(!flag && n<num){ //无冲突判断下一皇后
pos[n-1][i] = 1;
Select(pos,n+1,num);
pos[n-1][i] = 0;
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本