八皇后问题

来源:互联网 发布:cpi数据 编辑:程序博客网 时间:2024/06/06 07:25
      八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

 

#include "stdio.h" #include <stdlib.h> static char Queen[8][8]; static int a[8]; static int b[15]; static int c[15]; static int iQueenNum=0; void qu(int i); int main() { int iLine,iColumn; for(iLine=0;iLine<8;iLine++) { a[iLine]=0; for(iColumn=0;iColumn<8;iColumn++) Queen[iLine][iColumn]='*'; } for(iLine=0;iLine<15;iLine++) b[iLine]=c[iLine]=0; qu(0); return 0; } void qu(int i) { int iColumn; for(iColumn=0;iColumn<8;iColumn++) { if(a[iColumn]==0&&b[i-iColumn+7]==0&&c[i+iColumn]==0) { Queen[i][iColumn]='Q'; a[iColumn]=1; b[i-iColumn+7]=1; c[i+iColumn]=1; if(i<7) qu(i+1); else { int iLine,iColumn; printf("No.%d\n",++iQueenNum); for(iLine=0;iLine<8;iLine++) { for(iColumn=0;iColumn<8;iColumn++) printf("%c ",Queen[iLine][iColumn]); printf("\n"); } system("pause");   printf("\n\n"); } Queen[i][iColumn]='*'; a[iColumn]=0; b[i-iColumn+7]=0; c[i+iColumn]=0; } } } 


 


0 0
原创粉丝点击