n皇后

n皇后 第一篇 粗略

int tu[10]={0};//因题目里n<=9;
void dfs(int t,int n);
int main() {
    int n;
    read(n);
    if(n>=4)
    dfs(1,n);
    else
        cout<<"no solute!";//这里取了个巧,3阶一下肯定是没有题解的所以就直接出答案。
    return 0;
}
void dfs(int t,int n)//重头戏。t是代表第几个皇后也是代表第几行。
{
    if(t>n)//能到这说明已经全部放完了,就只有把答案输出来就行了。
    {
        for(int i=1;i<=n;i++)
        {
            if(i!=n)//题目输出格式要求不用管。
            cout<<tu[i]<<" ";
            else
                 cout<<tu[i];
        }
        cout<<endl;
        return ;
    }
    int f=0;//插个旗来表明这个皇后放的行不行。
    for(int i=1;i<=n;i++)//这一层循环是枚举一行的每一个,也就是一行中的每一列。
    {
       tu[t]=i;//tu[t]上文中说了t是第几个皇后也就是第几行,而i就是第t个皇后放在了第t行第i列。
       f=1;//这里先不管放的对不对,先把旗子插上,以助于后面判断。
       for(int j=1;j<t;j++)//这就是回过头去判断现在放的位置与之前放的位置冲不冲突。
       {
           if(tu[j]==tu[t]||((fabs(t-j))==fabs(tu[j]-i)))
           {
               f=0;//冲突,把旗子拔掉,再试下一列,不冲突就直接放下一个皇后。
               break;
           }
       }
        if(f==1)dfs(t+1,n);
    }
}

tu[j]==tu[t],这个是判断其在不在一列。
((fabs(t-j))==fabs(tu[j]-i)),这个是判断在不在对角线上,不知道为什么的自己举两个例子就是。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值