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 }
  • 相关阅读:
    使用RedisTemplate的操作类访问Redis(转载)
    Redis集群方案(来自网络)
    Scale-up and Scale-out(转载)
    数据结构和算法分析 优先队列
    数据结构和算法分析 排序
    linux下的常用命令
    Java HashMap的工作原理(转载)
    二叉查找树(转载)
    Redis实现之对象(三)
    Redis实现之对象(二)
  • 原文地址:https://www.cnblogs.com/cxq1126/p/8410850.html
Copyright © 2011-2022 走看看