n皇后问题

本文介绍了一个使用深度优先搜索(DFS)解决N皇后问题的算法。该算法通过递归放置皇后并检查冲突来找到所有可能的排列。在每一行中,尝试将皇后放在不同的列,如果当前位置可行,则继续下一列,直到完成所有行。当所有皇后都成功放置且没有冲突时,输出排列。同时,每次回溯时清除当前行的皇后位置以寻找新的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:
存在n*n的格子,往里放n个皇后(棋子),对每一个放入的棋子要求其同一行、同一列以及对角线不能存在其它的棋子。输出在数目为n的情况下所有的排列情况
问题解答:
1.主体函数如图所示,一共有n行,使用a这个数组记录此行的棋子摆在第几列,例如a[3]= 7的含义就是说第三行的棋子摆在第七列,从第一行开始摆棋子,如果check函数返回true表明这个位置可以摆放就标记a数组,递归进行下一行,知道第n+1行此时得到所有棋子位置,输出。在dfs返回后就清空a数组用于下一种排列方式使用。

void dfs(int row)
{
if(row == n+1)
{
cnt++;
for(int i = 1;i <= n; i++)
std::cout<<a[i]<<" ";
std::cout<<std::endl;
return;
}
for(int i = 1;i <= n;i++)
{
if(check(row,i))
{
a[row] = i;
dfs(row+1);
a[row] = 0;
}
}
}

2.check函数如图,作用是检查第row行的棋子能否放在第col列,故知前row-1行已经摆完了,而之后的行还没开始。故要检查这一列是否有棋子,以及左右对角线是否有棋子。注意左右对角线的检查方式。

bool  check(int row,int col)
{
for(int i = 1;i < row; i++)
{
if(a[i] == col) return false;
if(i+a[i] == row + col) return false;
if(a[i]-i == col - row) return false;
}
return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值