[C++]数据结构:算法分析之八皇后问题

来源:互联网 发布:网页菜单制作软件 编辑:程序博客网 时间:2024/06/01 08:48
/************************************************************************//*八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。/*该问题是十九世纪著名的数学家高斯1850年提出:/*在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,/*即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。/************************************************************************///使用position数组来存储皇后的摆放位置。//例如:position[2]=4//表示第2行的皇后放在了第4列。//第0列开始依次遍历。//代码中每次摆放成功便输出position数组以便于理解。//可先输入Queen=5看一下摆放的原理。#include <iostream>#include <math.h>#include <malloc.h>using namespace std;int *position; //用数组放置的位置,p=position[i]:第i行的皇后在第p列int queens; //皇后数目int count; //第N种可能性//判断第n行是否放置皇后bool SignPoint(int n){    for (int i=0;i<n;i++)    {        if (position[i] == position[n]) //该列已经放置过皇后了            return false;        if (abs(position[i] - position[n]) == n-i) //对角线已经放置过了            return false;    }    return true;}//在第n列摆放皇后皇后//默认是从第0列开始void SetQueen(int n=0){    if (queens==n)//如果相等则表示排列到了最后一列,将结果输出    {cout<<"No."<<++count<<endl;        for (int i=0;i<queens;i++)//遍历每一行        {            for (int j=0;j<queens;j++)//遍历每一列            {                if (j == position[i])                {                    cout<<j<<" ";//如果列数等于position中存储的列数则将该列数输出                }                else                {                    cout<<"* ";//否则输出*表示不放皇后                }            }            cout<<endl;        }for (int t=0;t<queens;t++)//输出position数组        {cout<<"position["<<t<<"]="<<position[t]<<endl;}        cout<<endl;        return;    }    else//如果不相等则开始将皇后放到这一列    {        for (int i=0;i<queens;i++)//准备将皇后摆在第i行        {            position[n] = i;//将皇后摆到了第n行,存储的列数为i进行校验            if(SignPoint(n))//如果该位置放置皇后正确的话            {                SetQueen(n+1);//继续摆放下一列的皇后            }        }    }}int main(){    cout<<"请输入皇后的总数:"<<endl;    cin>>queens;    position = new int[queens];    SetQueen();    cout<<"摆放完毕"<<endl;    return 0;}