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);}
阅读全文
0 0
- 求解n皇后问题
- 求解N皇后问题
- n皇后问题求解
- N皇后问题求解算法
- n皇后问题求解 java
- 八皇后、N皇后问题的求解。
- 使用C#求解N皇后问题。
- C语言编程 N皇后问题求解
- 递归求解N皇后问题(c语言)
- N皇后问题的求解(C++代码)
- 回溯法求解n皇后问题
- QS2算法求解N-皇后问题
- N皇后问题回溯法求解
- n皇后问题-位运算求解
- 递归与迭代法求解N皇后问题
- 回溯法求解n皇后问题
- 回溯法求解N皇后问题。
- N皇后问题利用回溯法求解
- 15.3 Content-MD5:实体校验
- word 图片缩放并居中
- C++ printf
- Java中静态代码块、构造代码块的区别
- eclipse中java代码关联到mybatis的xml文件
- n皇后问题求解
- http与ftp的区别
- VS2015update2环境下DirectX11编程说明
- vue sass 安装
- java根据图片的url地址下载图片到本地
- 成员变量和类变量的区别
- 前端训练练习网
- iOS算法总结-归并排序
- 带你逐步深入了解SSM框架——淘淘商城项目之项目介绍及搭建maven工程