算法与分析

回溯法是一种组织搜索的一般技术,有“通用的解题法”之称,用它可以系统的搜索一个问题的所有解或任一解。
有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。
可以系统地搜索一个问题的所有解或任意解,既有系统性又有跳跃性。
回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。
这种以深度优先的方式系统地搜索问题的解的方法称为回溯法。

2n皇后问题

#include<bits/stdc++.h>
using namespace std;
int chess[9][9] = {0};
int n=0;
int num=0;
bool check(int curR,int pos[])
{
    for(int i=1;i<curR;i++)
    {
        if(pos[curR]==pos[i]||(abs(curR-i)==abs(pos[curR]-pos[i])))
            return false;
    }
    return true;
}
void dfs(int curR,int posB[],int posW[])  //放一种皇后
{
    if(curR == n+1)
    {
        num++;
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(posB[curR]==i)
            continue;
        if(chess[curR][i]==0)
            continue;
        posW[curR] = i;
        if(check(curR, posW)==true)
        {
            dfs(curR+1, posB, posW);
        }
    }
}
void dfs1(int curR,int posB[],int posW[])  //放另一种皇后
{
    if(curR>n)
    {
        dfs(1,posB,posW);
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(chess[curR][i]==0)
            continue;
        posB[curR] = i;
        if(check(curR, posB)==true)
        {
            dfs1(curR+1,posB,posW);
        }
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cin>>chess[i][j];
    }
    int posB[15] = {0};
    int posW[15] = {0};
    dfs1(1, posB, posW);
    cout<<num;
    return 0;
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值