八皇后问题

  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编辑  收藏  举报

导航