首页 > 代码库 > 八皇后问题
八皇后问题
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*8126 //每一行每一列都初始化为0127 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 }
八皇后问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。