zoukankan      html  css  js  c++  java
  • 递归与分治思想:八皇后问题 (在此用递归) (回溯算法的典型题)

      1 做法:第一步随便放一个棋子,然后找安全位置放第二个棋子,然后放好后再找安全地放第三个x棋子,以此类推
      2 详细解释:https://www.bilibili.com/video/av76265320?from=search&seid=10595269197283770223
      3 #include<stdio.h>
      4 
      5 int count = 0;
      6 int notdanger(int row, int j, int(*chess)[8])
      7 {
      8     int i,k;
      9     int flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
     10     
     11     for(i=0; i<8; i++)  //判断列 
     12     {
     13         if( *(*(chess+i)+j) != 0 )
     14         {
     15             flag1 = 1;
     16             break; 
     17         }
     18     }
     19     
     20     for(i=row,k=j; i>=0 && k<8; i--,k++)//判断右上方
     21     {
     22         if( *(*(chess+i)+k) != 0 )
     23         {
     24             flag2 = 1;
     25             break;
     26         }
     27     }
     28     
     29     for(i=row,k=j; i<8 && k>=0; i++,k--)//判断左下方
     30     {
     31         if( *(*(chess+i)+k) != 0 )
     32         {
     33             flag3 = 1;
     34             break;
     35         }
     36     }
     37     
     38     for(i=row,k=j; i<8 && k<8; i++,k++)//判断右下方 
     39     {
     40         if( *(*(chess+i)+k) != 0 )
     41         {
     42             flag4 = 1;
     43             break;
     44         }
     45     }
     46     
     47     for(i=row,k=j; i>=0 && k>=0; i--,k--)//判断左上方 
     48     {
     49         if( *(*(chess+i)+k) != 0 )
     50         {
     51             flag5 = 1;
     52             break;
     53         }
     54     }
     55     
     56     if(flag1 || flag2 || flag3 || flag4 || flag5)
     57     {
     58         return 0;
     59     }
     60     else
     61     {
     62         return 1;
     63     }
     64 }
     65 //row表示起始行
     66 //n表示总列数
     67 //(*chess)[8]表示指向每一行的指针 
     68 void EightQueen(int row, int n, int(*chess)[8])
     69 {
     70     int i,j,k;
     71     int chess2[8][8];
     72     
     73     for(i=0; i<8; i++)
     74     {
     75         for(j=0; j<8; j++)
     76         {
     77             chess2[i][j] = chess[i][j];
     78         }
     79     }
     80     
     81     if(row == 8)
     82     {
     83         printf("这是第 %d 种\n",count+1);
     84         for(i=0; i<8; i++)
     85         {
     86             for(j=0; j<8; j++)
     87             {
     88                 printf("%d ",*(*(chess2+i)+j));
     89             }
     90             printf("\n");
     91         }
     92         printf("\n");
     93         count++;
     94     }
     95     else
     96     {
     97         for(k=0; k<n; k++) //判断此行每一个位置    八个位置都尝试一遍 
     98         {
     99             if(notdanger(row,k,chess))
    100             {
    101                 for(i=0; i<8; i++)  //回溯 
    102                 {
    103                     *(*(chess2+row)+i) = 0;
    104                 }
    105                 *(*(chess2+row)+k) = 1;
    106                 
    107                 EightQueen(row+1,n,chess2);  //一行放完再放下一行 
    108             }
    109             
    110         }
    111     }
    112 } 
    113 int main(void)
    114 {
    115     int chess[8][8];
    116     int i,j;
    117     
    118     for(i=0; i<8; i++)
    119     {
    120         for(j=0; j<8; j++)
    121         {
    122             chess[i][j] = 0;
    123         }
    124     }
    125     
    126     EightQueen(0,8,chess);
    127         printf("\n一共有 %d 中摆法\n",count);
    128     return 0;
    129 } 
  • 相关阅读:
    Timer定时任务
    spring boot配置多数据源
    消费者模块调用提供者集群报错
    修改windHost文件
    spring常用注解+Aop
    添加ClustrMaps
    无题
    2020年3月21日 ICPC训练联盟周赛,Benelux Algorithm Programming Contest 2019
    2020年3月14日 ICPC训练联盟周赛,Preliminaries for Benelux Algorithm Programming Contest 2019
    2020.4.12 个人rating赛 解题+补题报告
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12491496.html
Copyright © 2011-2022 走看看