2n皇后(蓝桥杯)(计蒜客)(简洁明了不多bb)

题干:

我都会将理解与代码结合,希望通俗易懂的跟大家讲明白。

代码:

#include<bits/stdc++.h>
using namespace std;
int mp[10][10];
int ans,n;
int vy[10]; //列 
int vd1[20];//主对角线 
int vd2[20];//负对角线 
void dfs(int x,int p)
{     // x:行   p:颜色的情况
/*
    初步理解一下:
    本题用dfs 
     p=1 是一种颜色
     p=2 是另一种颜色 
     mp=1就是代表可以
     mp=0就是代表不可以
      
*/
    if(x==n&&p==2)
    { 
    // 此处ans++满足的条件是,两个颜色(p==2)都已经搞完了(x==n) 
        ans++;
        return ;
    }
    if(x==n)
    {
        dfs(0,p+1);
        return ;
    }
    for(int i=0; i<n; i++)
    {
        if(mp[x][i]&&vy[i]!=3&&vy[i]!=p&&vd1[x+i]!=3&&vd1[x+i]!=p&&vd2[x-i+n]!=3&&vd2[x-i+n]!=p)
        {
            /*  这个地方也是我一开始不理解的  */
            // mp=1表示符合 
            // !=p 是因为前面可能经历了0+p;也就是这个点前面用过了 
            // !=3是对于第二个颜色,因为前面可能+1了,如果再用!=p判断显然不适宜了,然后我们可以用!=3(0+=1---->1+=2) 
            mp[x][i]=0;
            vy[i]+=p;
            vd1[x+i]+=p;
            vd2[x-i+n]+=p;
            //调用,不用多说了 
            dfs(x+1,p);
            //这个就是回溯 
            mp[x][i]=1;
            vy[i]-=p;
            vd1[x+i]-=p;
            vd2[x-i+n]-=p;
        }
    }


}
int main()
{
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            scanf("%d",&mp[i][j]);
        }
    }
    dfs(0,1);
    printf("%d\n",ans);
    return 0;
}
 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

活在当下 北乔

不爱多bb,朴实一句话:感谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值