• 八皇后问题


      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
    ",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("
    ");
     95         }
     96         printf("
    ");
     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 }
  • 相关阅读:
    word-流程图
    redis介绍
    Linux----硬盘分区
    Vue+restfulframework示例
    Django后端项目---- rest framework(4)
    前端框架VUE----导入Bootstrap以及jQuery的两种方式
    前端框架VUE----补充
    前端框架VUE----表单输入绑定
    前端框架VUE----cli脚手架(框架)
    前端框架VUE----计算属性和侦听器
  • 原文地址:https://www.cnblogs.com/luoweiKnowledge/p/3960768.html
Copyright © 2020-2023  润新知