您的位置:首页 > 其它

第1次实验——八皇后及N皇后问题

2014-06-09 22:10 162 查看
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。 请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代表空)。并把此问题的求解过程延伸到N皇后问题。



#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#define QUEENS 8
int iCount = 0;
int Site[QUEENS];
void Queen(int n);
void Output();
int IsValid(int n);
void main(){
cout<<"                    "<<"八皇后的解法:"<<endl;
cout<<"        "<<"-------------------------------------"<<endl;
Queen(0);
}
void Queen(int n){
int i;
if(n == QUEENS){
Output();
return;
}
for(i = 1 ; i <= QUEENS ; i++) {
Site
= i;
if(IsValid(n))
Queen(n + 1);
}
}
int IsValid(int n){
int i;
for(i = 0 ; i < n ; i++){
if(Site[i] == Site
)
return 0;
if(abs(Site[i] - Site
) == (n - i))
return 0;
}
return 1;
}
void Output() {
if(++iCount<=3){
cout<<"No."<<iCount<<endl;
for(int i = 0 ; i < QUEENS ; i++){
for( int j = 1 ;j <= QUEENS ; j++)
if(j==Site[i])
cout<<"1 ";
else
cout<<"0 ";
cout<<endl;
}
}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: