• 八皇后问题


    #include<iostream>
    using namespace std;

    int a[8];
    int count=0;

    void solve(int k)
    {
    //得到一种解法,cnt++
    if(k==8) //8个皇后都放置好了
    {
    count ++;

    //输出当前8个皇后的一种放置情况
    /*
    for(int n=0;n<8;n++)
    cout<<a[n]<<" ";
    cout<<endl;
    */

    for(int m=0;m<8;m++)//控制行
    {
    for(int n=0;n<8;n++)
    {
    if(a[m]==n)
    {
    cout<<"1"<<" ";
    }
    else
    cout<<"0"<<" ";
    }
    cout<<endl;
    }
    cout<<"------------------"<<endl;


    return;
    }

    //枚举所有的可能

    //第i个皇后,放在第a[i]列。
    for(int i=0;i<8;i++)
    {
    a[k]=i;//第k位皇后要放置,从第k行的第0个位置开始寻找;
    int ok=1;//表示第k位皇后安置好了
    //判断是否与之前的皇后[0,1,...k]在同一列,是否在之前皇后的对角线上
    for(int j=0; j<k;j++)
    {
    //判断是否同一列:a[k]==a[j]
    //判断是否在之前皇后的对角线上,第j个皇后放在第a[j]列。。
    //主对角线:(1)行加一,列加一(2)行减一,列减一:行与列的差值不变:i-a[i]=j-a[j]->i-j=a[i]-a[j]
    //副对角线:(1)行减一,列加一(2)行加一,列减一:行与列的和值不变:i+a[i]=j+a[j]->i-j=-(a[i]-a[j])
    // 两式合并:abs(i-j)==abs(a[i]-a[j])
    if(a[k]==a[j] || abs(k-j)==abs(a[k]-a[j]))
    {
    ok=0;//要么在同一列,要么主,副对角线上
    break;//试试下一个i位置
    }

    }
    if(ok)//该i位置可以放
    {
    solve(k+1);//下一个皇后的位置
    }


    }

    }
    int main()
    {
    solve(0);
    cout<<count<<endl;
    return 0;
    }

  • 相关阅读:
    网页日历显示控件calendar3.1
    切换“使用被动式FTP”
    href="javascript:xxx(this);"和onclick="javascript:xxx(this);"的区别
    CSS布局--上中下布局(上下固定,中间自适应)
    css字体颜色动画
    怎么让jQuery支持swipe事件
    html 5 canvas
    javascript面向对象
    WEB相关存储方式
    angularjs
  • 原文地址:https://www.cnblogs.com/beihaidao/p/8505586.html
Copyright © 2020-2023  润新知