zoukankan      html  css  js  c++  java
  • 八皇后问题——回溯

    经典八皇后问题参考博客http://blog.csdn.net/mbh_1991/article/details/23869459

    下面解决八皇后的改版问题:

    AC代码:

     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 char board[10][10];
     6 int board2[10][10];
     7 int num=0;                                    //记录八皇后的个数 
     8 int res=0; 
     9 int dir[3][2]={{-1,-1},{-1,1},{-1,0}};        //检测三个方向,左上,右上,正上(对一排来说,从上往下放置只看上一层的情况) 
    10 
    11 void init(){                                 //初始化 
    12     for(int i=1;i<=8;i++){
    13         for(int j=1;j<=8;j++){
    14             board[i][j]='.';
    15             cin>>board2[i][j];
    16         }
    17     }
    18 } 
    19 
    20 bool check(int i,int j){                                //行和列 
    21     bool flag=true;
    22     for(int p=0;p<3;p++){
    23         int ni=i;
    24         int nj=j;
    25         while(flag&&(ni>=1)&&(ni<=8)&&(nj>=1)&&(nj<=8)){//判断是否到棋盘边界 
    26             ni+=dir[p][0];
    27             nj+=dir[p][1]; 
    28             flag=flag&&(board[ni][nj]!='*');            //判断这个方向没有放过皇后 
    29         }
    30     }
    31     return flag;
    32 }
    33 
    34 void allMax(){                                      //查找最大值 
    35     int sum=0;
    36     for(int i=1;i<=8;i++){
    37         for(int j=1;j<=8;j++){
    38             if(board[i][j]=='*'){
    39                 sum+=board2[i][j];
    40             }
    41         }
    42     }
    43     if(sum>res){
    44         res=sum;
    45     }
    46 } 
    47 
    48 void dfs(int i){        
    49     if(i>8){                    //判断是否超过了八行
    50         allMax();
    51         num++; 
    52     }else{
    53         for(int j=1;j<=8;j++){        //判断一行是否有匹配的位置 
    54             if(check(i,j)){
    55                 board[i][j]='*';     //放置皇后 
    56                 dfs(i+1);
    57                 board[i][j]='.';     //清除放错的皇后 
    58             }
    59         }
    60     } 
    61 }
    62 
    63 int main(){
    64     init();
    65     dfs(1);
    66     cout<<res<<endl;
    67     return 0;
    68 }
  • 相关阅读:
    第十章 2 字符串的常用操作
    第十章 1 字符(驻留机制)
    第九章 4 集合生成式
    ArrayDeque API 与算法分析
    Java 双端队列接口 Deque
    LinkedList 的 API 与数据结构
    ArrayList 源码分析
    new ArrayList(0) 和 new ArrayList() 和一样吗?
    Java 中泛型的实现原理
    Java 中的 equals() 和 hashCode()
  • 原文地址:https://www.cnblogs.com/cxq1126/p/8410850.html
Copyright © 2011-2022 走看看