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

来源:互联网 发布:上海然旭网络怎么样 编辑:程序博客网 时间:2024/04/28 01:28
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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 8int 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[n] = i;      if(IsValid(n))        Queen(n + 1);   } }int IsValid(int n){int i;   for(i = 0 ; i < n ; i++){if(Site[i] == Site[n])  return 0;         if(abs(Site[i] - Site[n]) == (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 ";elsecout<<"0 ";cout<<endl;} } }  


0 0