zoukankan      html  css  js  c++  java
  • 八皇后问题---暴力求解

        八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

    #include<iostream>
    #include<math.h>
    using namespace std;
    
    
    int main() {
        //数据说明
        /*    s用来做判断条件
            w用来计数
            f[]用来储存数的个数
            g[]用来存储具体数 
         */ 
        int s,i,w,x,k,f[10],g[9];
        long a,y;
        s=0;
        w=0;
        cout<<"八皇后问题的解为"<<endl;
        
        for(a=12345678;a<=87654321;a=a+9)
            {    y=a;    
                for(i=8;i>=1;i--)//分离数字 
                    {    
                        x=y%10;//从末尾开始取
                        y=y/10;
                        g[i]=x;
                        if(x==0)
                            s=1;//保证有八个棋子 
                        f[x]=f[x]+1;//计数 
                    } 
                //判断
                    
                //1.每个皇后不能同行
                    for(i=0;i<10;i++)
                        if(f[i]>=2)
                        {
                            s=1;break;
                        }
                                                
                //2.皇后不能呈45度    
                    for(i=1;i<8;i++)
                        for(k=i+1;k<=8;k++)
                    {
                        if(fabs(g[i]-g[k])==k-i)
                        {    s=1;break;//break要丢在括号里面 
                        }
                                            
                    }     
                if(s==0)
                {
                    cout<<a<<endl;
                    w++;//计数 
                }
                
                //初始化数据 
                for(i=0;i<10;i++)
                {    f[i]=0;
                    g[i]=0; 
                }    
                s=0;
                    
                    
            }
            cout<<w<<endl;
    
        return 0;
    }
    View Code

    总结:

        1.关于暴力求解问题,还是要在草稿纸上先把约束条件都大致写出来,免得到时候又去一步步的调试。

        2.注意代码风格,不管语句是几行,都把{}打上

  • 相关阅读:
    JavaScript关闭窗口的方法
    .NET 实现异步处理的集中方式
    c#调用系统资源大集合-3
    c#调用系统资源大集合-2
    android sqlite 操作使用
    android 适配的大小设置
    java.lang.IllegalStateException: Fragment already added:
    keydown 事件响应处理
    android 图表图形显示推荐 开源库
    android bitmap mutable
  • 原文地址:https://www.cnblogs.com/printwangzhe/p/12307867.html
Copyright © 2011-2022 走看看