n皇后问题求解

来源:互联网 发布:指纹比对算法 编辑:程序博客网 时间:2024/05/21 10:05

       八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

     下面利用栈来求解。

#include <iostream.h>#include <stdlib.h>#include <math.h>#define MaxSize 100typedef int data;typedef struct  {      int data[MaxSize];  //data[i]存放第i个皇后的列号      int top;            //栈顶指针  } StNode;               //定义顺序栈类型  /**********************初始化栈**********************/void InitStack(StNode *&s){s = new StNode;s->top = 0;;}/**********************销毁栈********************/void DestroyStack(StNode *&s){free (s);}/******************判断栈是否为空*******************/bool StackEmpty(StNode *s){return (0 == s->top);}/********************进栈****************/bool Push(StNode *&s, data e){if (MaxSize -1 == s->top)return false;s->top++;s->data[s->top] = e;return true;}/**********************出栈*******************/bool Pop(StNode *&s, data &e){if (0 == s->top)return false;e = s->data[s->top];s->top--;return true;}/***************判断是否可以放下皇后*************/bool IsPlace(StNode *s, int i, int j){int k = 1;if (i == 1)//第一个皇后return true;while (k < i)//遍历已放下的皇后{if ((s->data[k]==j)||(fabs(j-s->data[k])==fabs(i-k)))//判断是否同行或斜线return false;elsek++;}return true;}void PrintEightQueen(StNode *s,int n,int &sum){cout<<"第"<<++sum<<"个解:  ";for (int k = 1; k <= s->top; k++){cout<<"("<<k<<","<<s->data[k]<<")  ";}cout<<endl;for (int x = 1; x <= n; x++){for (int y = 1; y <=  n; y++){if (s->data[x] == y)cout<<"Ж";elsecout<<"□";}cout<<endl;}cout<<endl;}/**************求解皇后**************/void EightQueen(StNode *&s,int n){int sum = 0;data e;Push(s,1);//(1,1)进栈int i;int j;int put = 0;while (!StackEmpty(s)){i = s->top;if (s->top == n)//所有皇后都找到{PrintEightQueen(s,n,sum);}put = 0;for (j = 1; j <= n; j++)//查找当前行可放下的位置{if (IsPlace(s,i+1,j))//可放下进栈{e = j;Push(s,e);put = 1;break;}}if (0 == put)//找不到{while (!StackEmpty(s)){Pop(s,e);while (++e <= n)//查找退栈当行的的下一个位置是否可放下皇后{if(IsPlace(s,s->top+1,e)){Push(s,e);put = 1;break;}}if (put)break;}}}}void main(){int num;cout<<"请输入要n皇后问题(n):";cin>>num;StNode *s;InitStack(s);EightQueen(s,num);DestroyStack(s);}


原创粉丝点击