八皇后问题---暴力求解

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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.注意代码风格,不管语句是几行,都把{}打上

原文地址:https://www.cnblogs.com/printwangzhe/p/12307867.html