八皇后问题
1 #include <stdio.h> 2 #include <stdlib.h> 3 int count=0; 4 5 //该函数主要是查询皇后摆放位置是否危险 6 notDanger(int row,int n,int (*chess)[8]) 7 { 8 int i,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,k; 9 10 //查询当前位置的当前列是否安全 11 for(i=0;i<8;i++) 12 { 13 if(*(*(chess+i)+n)!=0) 14 { 15 flag1=1; 16 break; 17 } 18 } 19 //查询左上角是否安全 20 21 for(i=row,k=n;i>=0&&k>=0;i--,k--) 22 { 23 if(*(*(chess+i)+k)!=0) 24 { 25 flag2=1; 26 break; 27 } 28 } 29 //查询右下角是否安全 30 for(i=row,k=n;i<8&&k<8;i++,k++) 31 { 32 if(*(*(chess+i)+k)!=0) 33 { 34 flag3=1; 35 break; 36 } 37 } 38 //查询右上角是否安全 39 40 for(i=row,k=n;i>=0&&k<8;i--,k++) 41 { 42 if(*(*(chess+i)+k)!=0) 43 { 44 flag4=1; 45 break; 46 } 47 } 48 //查询左下角是否安全 49 for(i=row,k=n;i<8&&k>=0;i++,k--) 50 { 51 if(*(*(chess+i)+k)!=0) 52 { 53 flag5=1; 54 break; 55 } 56 } 57 58 if(flag1 || flag2 || flag3 || flag4 || flag5) 59 { 60 return 0; 61 } 62 else 63 { 64 return 1; 65 } 66 } 67 68 //row:表示棋盘的初始行 69 //n:表示有多少列 70 //(*chess)[8]:表示每一行的起始位置 71 72 eightqueen(int row,int n,int (*chess)[8]) 73 { 74 75 //定义多一个棋盘,主要是为了得到结果时存放数据使用 76 int chess2[8][8],i,j,k; 77 for(i=0;i<8;i++) 78 { 79 for(j=0;j<8;j++) 80 { 81 chess2[i][j]=chess[i][j]; 82 } 83 } 84 //因为是通过移动行来进行查询的,所以结束条件也是通过比较行数来终结的 85 if(row==8) 86 { 87 printf("total %d\n",count); 88 for(i=0;i<8;i++) 89 { 90 for(j=0;j<8;j++) 91 { 92 printf("%d ",*(*(chess2+i)+j)); 93 } 94 printf("\n"); 95 } 96 printf("\n"); 97 count++; 98 } 99 //当还没有遍历完所有行的时候进入else语句 100 else{ 101 //因为递归是通过移动行的,所以查找危不危险 102 //是看在这一行上的所有列危不危险 103 for(j=0;j<n;j++) 104 { 105 //如果当前行的所有列都不是危险的 106 //就先将所有的列初始化为零,然后通过判断,得知第row行第j列不危险 107 //就将其设置为1,进行递归,也就是查询下一行 108 if(notDanger(row,j,chess)) 109 { 110 for(i=0;i<8;i++) 111 { 112 *(*(chess2+row)+i)=0; 113 } 114 *(*(chess2+row)+j)=1; 115 eightqueen(row+1,n,chess2); 116 } 117 } 118 119 } 120 } 121 122 int main() 123 { 124 int i,j; 125 int chess[8][8]; //定义一个棋盘8*8 126 //每一行每一列都初始化为0 127 for(i=0;i<8;i++) 128 { 129 for(j=0;j<8;j++) 130 { 131 chess[i][j]=0; 132 } 133 } 134 135 eightqueen(0,8,chess); 136 137 return 0; 138 }
posted on 2014-09-07 20:46 daocaorendeshijie 阅读(121) 评论(0) 编辑 收藏 举报