八皇后问题--递归算法

来源:互联网 发布:hifi音响推荐 知乎 编辑:程序博客网 时间:2024/04/28 07:30
#include<stdio.h>int count=0;int noDanger(int row,int j,int (*chess)[8]){int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;//判断列方向有没有危险for(i=0;i<8;i++){if( *(*(chess+i)+j) != 0){flag1 = 1;break;}}//判断左上方for(i=row,k=j;i>=0&&k>=0;i--,k--){if(*(*(chess+i)+k) != 0){flag2 =1;break;}}//判断右下方for(i=row,k=j;i<8 && k<8;i++,k++){if(*(*(chess+i)+k) != 0){flag3 =1;break;}}//判断右上方for(i=row,k=j;i>=0 && k<8;i--,k++){if(*(*(chess+i)+k) != 0){flag4 =1;break;}}//判断左下方for(i=row,k=j;i<8 && k>=0;i++,k--){if(*(*(chess+i)+k) != 0){flag5 =1;break;}}if(flag1||flag2||flag3||flag4||flag5)return 0;else return 1;}//参数row表示起始的行//参数n表示列数//chess表示每一行的指针void EightQueen(int row,int n,int (*chess)[8]){int chess2[8][8],i,j;for(i=0;i<8;i++){for(j=0;j<8;j++){chess2[i][j]=chess[i][j];}}if(8 == row){printf("第 %d 种\n",count+1);for(i=0;i<8;i++){for(j=0;j<8;j++){printf("%d ",*(*(chess2+i)+j));}printf("\n");}count++;}else{for(j=0;j<n;j++){if(noDanger(row,j,chess))//判断是否危险{for(i=0;i<8;i++){*(*(chess2+row)+i)=0;}*(*(chess2+row)+j) = 1;EightQueen(row+1,n,chess2);}}}}int main(){int chess[8][8]={0},i,j;EightQueen(0,8,chess);printf("总共有 %d 种解决方法\n",count);return 0;}

0 0
原创粉丝点击