• 八皇后问题 (递归 搜索)


    八皇后问题:要在国际象棋棋盘8*8中放八个皇后,使任意两个皇后都不能互相吃。(提示:皇后能吃同一行、同一列、同一对角线的任意棋子。)
     /*分析:每一列,每一行,每一个对角线只能放一个皇后,判断对角线是否能放的条件是两个皇后横纵坐标的和或者是差不能相等,若相等,则在一个对角线,不能放置,每放一个皇后,都要占领他所在的行,列,对角线*/
    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<iomanip>
    using namespace std;
    bool d1[100],d2[100],l[100];
    int a[100];
    int total;
    int search(int);
    int print();
    int main()
    {
    search(1);//从第一个皇后开始放(很像素数环从第一个开始填,我们都是从简单的开始,从什么地方开始递归很重要)
    return 0;
    }
    int search(int x)//放第x个皇后,或者说是放第x行上的皇后(8个皇后一共8行,一定1行1个)
    {
    for(int i=1;i<=8;i++)//寻找可以放置的列数
    if((!l[i])&&(!d1[i+x])&&(!d2[x-i+7]))//如果第i列没有被放置,且两个对角线没有被占领;
    {
    a[x]=i;//第x个皇后在第i列
    l[i]=1;//占领列数
    d1[i+x]=1;//占领对角线
    d2[x-i+7]=1;
    if(x==8)print();//当放满8个或者说是每一行都有皇后输出
    else
    search(x+1);//没放完,继续放下一个
    l[i]=0;//回溯
    d1[x+i]=0;
    d2[x-i+7]=0;
    }
    }
    int print()//输出
    {
    total++;
    cout<<"sum="<<total<<endl;
    for(int i=1;i<=8;i++)
    cout<<setw(4)<<a[i];//注意setw头文件是iomanip;
    cout<<endl;
    }

    //和素数环很像,都是有几个空,然后从第一个开始填,只是能填的条件不一样;

  • 相关阅读:
    laravel获取不到session
    laravel表单提交419错误
    'cross-env' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    centos 虚拟机出问题 Oh no,something has gone wrong! 解决方法
    fastadmin关闭验证码登录
    php二维数组排序
    不自动显示html表单记住的内容 自动完成等清除记忆
    两个服务器之间使用minio同步文件
    redis获取数据库个数
    html跳转页面
  • 原文地址:https://www.cnblogs.com/zzyh/p/6604374.html
Copyright © 2020-2023  润新知