zoukankan      html  css  js  c++  java
  • 八皇后问题 (递归 搜索)

    八皇后问题:要在国际象棋棋盘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;
    }

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

  • 相关阅读:
    Mysql中的递归查询
    让git忽略对已经版本控制的文件的本地修改
    关于c#中逆变和协变的理解
    把之前的相关博客都迁到了博客园~
    结合github pages使用travis CI
    Spring中的Filter、HandlerInterceptor和AOP
    HDU1711 Number Sequence 题解 KMP算法
    HDU1358 Period 题解 KMP算法
    HDU1686 Oulipo 题解 KMP算法
    HDU3336 Count the string 题解 KMP算法
  • 原文地址:https://www.cnblogs.com/zzyh/p/6604374.html
Copyright © 2011-2022 走看看