zoukankan      html  css  js  c++  java
  • C语言 · 8皇后问题改编

    8皇后问题(改编)

    问题描述
      规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
    输入格式
      一个8*8的棋盘。
    输出格式
      所能得到的最大数字和
    样例输入
    1 2 3 4 5 6 7 8
    9 10 11 12 13 14 15 16
    17 18 19 20 21 22 23 24
    25 26 27 28 29 30 31 32
    33 34 35 36 37 38 39 40
    41 42 43 44 45 46 47 48
    48 50 51 52 53 54 55 56
    57 58 59 60 61 62 63 64
     
    样例输出
    260
    数据规模和约定
      棋盘上的数字范围0~99
     

    注释:递归题。

    棋盘:qipan[i][j];

    递归参数:当前行:begin;当前八皇后所在格子数字之和:sum;

    递归出口:至多有8个皇后;

    每轮操作都要判断选中位置的行、列、斜三个位置上是否有其他皇后,有则不能放,否则递归下一行(sum=sum+qipan[i][j])——注意标记数组在每一次递归后要恢复。

     1 /*
     2 测试数据: 
     3 1 2 3 4 5 6 7 8
     4 9 10 11 12 13 14 15 16
     5 17 18 19 20 21 22 23 24
     6 25 26 27 28 29 30 31 32
     7 33 34 35 36 37 38 39 40
     8 41 42 43 44 45 46 47 48
     9 48 50 51 52 53 54 55 56
    10 57 58 59 60 61 62 63 64
    11 */
    12 #include<stdio.h>
    13 int max=0,sum;//max表预设一个最大值,sum表所放皇后的位置的元素和
    14 int lie[9];//代表一竖n行
    15 int xie1[2*8];//代表从↖到↘对角线
    16 int xie2[2*8];//代表从↘到↖对角线
    17 int qipan[9][9];//棋盘权值
    18 int ans=0;
    19 void HuangHou(int begin,int sum){
    20     if(begin>8){//表示搜索到了第八行,说明此次为有效搜索 
    21         if(sum>max){
    22             max = sum;//max用来存放最大值 
    23         }
    24         ans++;
    25     }else{
    26         for(int i=1;i<=8;i++){//表每次搜索都是从第一列开始的 
    27             if(lie[i]==0 && xie1[begin+i-1]==0 && xie2[begin-i+8]==0){
    28                 lie[i]=1;
    29                 xie1[begin+i-1]=1;
    30                 xie2[begin-i+8]=1;
    31                 HuangHou(begin+1,sum+qipan[begin][i]);//搜索下一行 
    32                 lie[i]=0;
    33                 xie1[begin+i-1]=0;
    34                 xie2[begin-i+8]=0;
    35             }
    36         }
    37     } 
    38 }
    39 int main(){
    40     for(int i=1;i<=8;i++){//录入棋盘 
    41         for(int j=1;j<=8;j++){
    42             scanf("%d",&qipan[i][j]);
    43         }
    44     }
    45     HuangHou(1,0);//从第一行开始搜索 
    46     printf("总方案数:%d
    格子值最大的:%d",ans,max);
    47     return 0;
    48 }            
  • 相关阅读:
    CSP2021&NOIP2021游记
    P3835[模板]可持久化平衡树【无旋Treap】
    P4688[Ynoi2016]掉进兔子洞【莫队,bitset】
    C# (CSharp) ADODB.Command示例
    求最大公约数 算法记录
    流逝时间+Windows下监测文件夹
    C# WinForm开发系列 文章索引
    09年搞笑签名
    高三班主任写给学生的一封信(在读大学的要看完)
    北京生存法则
  • 原文地址:https://www.cnblogs.com/panweiwei/p/6674073.html
Copyright © 2011-2022 走看看