首页 > 代码库 > 八皇后问题

八皇后问题

  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 }

 

八皇后问题