八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。
本部分,使用递归问题进行求解,参考源码如下:
#include <stdio.h> #include <stdlib.h> #define MAX_IN 8 /*全局变量自动初始化为0*/ char matrix[MAX_IN][MAX_IN]={0}; int counts=0; int not_danger(int row,int j,char(*mat)[MAX_IN]) { int i,k; /*判断列方向是否有危险*/ for(i=0;i<MAX_IN;i++) if(*(*(mat+i)+j)!=0) return 0; /*判断左上方是否有危险*/ for(i=row,k=j;i>=0 && k>=0;i--,k--) if(*(*(mat+i)+k)!=0) return 0; /*判断右下方是否有危险*/ for(i=row,k=j;i<MAX_IN && k<MAX_IN;i++,k++) if(*(*(mat+i)+k)!=0) return 0; /*判断右上方是否有危险*/ for(i=row,k=j;i>=0&&k<MAX_IN;i--,k++) if(*(*(mat+i)+k)!=0) return 0; /*判断右上方是否有危险*/ for(i=row,k=j;i<MAX_IN && k>=0;i++,k--) if(*(*(mat+i)+k)!=0) return 0; return 1; } /*row 表示启始行,n表示列*/ void Eight_Queue(int row,int n,char(*mat)[MAX_IN]) { char chess2[MAX_IN][MAX_IN]; int i,j; for(i=0;i<MAX_IN;i++) for(j=0;j<MAX_IN;j++) chess2[i][j]=mat[i][j]; //memcpy(chess2,mat,8*8); if(MAX_IN==row) { printf("第%d种:\n",counts+1); for(i=0;i<MAX_IN;i++) { for(j=0;j<MAX_IN;j++) printf("%c ",*(*(chess2+i)+j)); printf("\n"); } printf("\n"); counts++; } else { /*判断这个位置是否有危险,如果有危险,如过没有危险继续往下*/ for(j=0;j<n;j++) { if(not_danger(row,j,mat))/*判断是否危险*/ { for(i=0;i<MAX_IN;i++) { *(*(chess2+row)+i)=0; } *(*(chess2+row)+j)=1; Eight_Queue(row+1,n,chess2); } } } } int main(int argc,char**argv) { Eight_Queue(0,8,matrix); printf("\n共有解决方法:%d\n",counts); return 0; }
原文地址:http://blog.csdn.net/u011889952/article/details/45012167