数据结构课程上机实验题(三)

编写一个程序exp3-6.cpp,求解皇后问题:在nxn的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同、不同左右对角线。

代码如下:

#include <iostream>
#include <stdlib.h>
using namespace std;
#define MaxSize 100
typedef struct
{
    int cols[MaxSize];                  //cols[i]存放第i+1个皇后的列号
    int top;	                        //栈顶指针
} SqStack;                              //定义顺序栈类型
int count=1;                            //记录解个数
bool place(SqStack *s,int i,int j)      //测试(i,j)是否与1~i-1皇后有冲突
{
    int k=0;
    if (i==0)                            //放第一个皇后时不会冲突
        return true;
    while (k<i)                          //j=0到k-1是已放置了皇后的列
    {
        if ((s->cols[k]==j)
                || (abs(j-s->cols[k])==abs(k-i)))
            return false;
        k++;
    }
    return true;
}

void queen(int n)
{
    SqStack *s;                          //定义栈
    s=(SqStack *)malloc(sizeof(SqStack));//初始化栈
    s->top=-1;                           //初始化栈顶指针
    s->top++;
    s->cols[s->top]=0;                   //将(0,0)进栈
    int i,j;
    bool Queen;
    while (s->top>=0)                    //栈不空时循环
    {
        i=s->top;
        if (s->top==n-1)                 //放好所有的皇后,输出一个解
        {
            cout<<"第"<<count++<<"个解:";
            for (int k=0; k<=s->top; k++)
                cout<<"("<<k+1<<","<<s->cols[k]+1<<") ";      //栈顶指针从0开始,应+1
            cout<<endl;
        }
        Queen=false;
        for (j=0; j<n; j++)
        {
            if (place(s,i+1,j))      	//在i+1行找到一个放皇后的位置(i+1,j)
            {
                s->cols[++s->top]=j;
                Queen=true;
                break;
            }
        }
        if (Queen==false)              //在i+1行找不到放皇后的位置,回溯9
        {
            while (s->top>=0)
            {
                if (s->cols[s->top]==n-1)         //本行没有可放位置,退栈
                    s->top--;
                for (j=s->cols[s->top]+1; j<=n; j++)   	//在本行找下一个位置
                {
                    if (place(s,s->top,j))
                    {
                        s->cols[s->top]=j;
                        break;
                    }
                }
                if (j>n-1)                               //当前皇后在本行没有可放的位置,退栈
                    s->top--;
                else                                     //本行找到一个位置后退出回溯
                    break;
            }
        }
    }
}

int main()
{
    int n;
    while (true)
    {
        cout<<"皇后问题(n<20) n=";
        cin>>n;
        if (n>20)
        {
            cout<<"n值太大,请重新输入。"<<endl;
            continue;
        }
        break;
    }
    cout<<n<<"皇后问题求解如下:"<<endl;
    queen(n);
    return 0;
}

运行结果:

数据结构课程上机实验题(三)_第1张图片

你可能感兴趣的:(数据结构,编程,博客)