蓝桥杯17-八皇后*改

59 篇文章 0 订阅
8 篇文章 0 订阅

title: 蓝桥杯17-八皇后*改
date: 2019-11-18 22:24:35
categories:

  • 蓝桥杯
    tags:
  • 蓝桥杯

蓝桥杯17-八皇后*改

  • 问题描述  
    规则同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

    49 50 51 52 53 54 55 56

    57 58 59 60 61 62 63 64

    样例输出260

    数据规模和约定  棋盘上的数字范围0~99

  • 解:使用回溯法

    package lanqiao;
    
    import java.util.Scanner;
    
    //问题描述
    //  规则同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
    public class day_17 {
        public  static  int[] judge = new int[8];//这个是储存八皇后各行取的数值
        public static int[] book = new int[8];//这个是判断八皇后遍历了多少个,避免重复遍历
        public  static int[][] number;//这个是储存数组
        public static  int max = -1;
        public static void main(String[] args){
            Scanner in = new Scanner(System.in);
            number = new int[8][8];
            for(int i=0;i<8;i++){
                for(int j=0;j<8;j++){
                    number[i][j] = in.nextInt();
                }
            }//读取数据
            in.close();
            dfs(0);
            System.out.println(max);
        }
        //遍历数据
        public static void dfs(int num){
            if(num==8){
                if(check()==true){
                    //判断成功,代表可以计算路径长度了
                    int j = 0;
                    for(int i=0;i<8;i++){
                        j+=number[i][judge[i]];
                    }
                    if(j>max){
                        max = j;
                    }
                }
            }
            for(int i=0;i<8;i++){
                if(book[i]==0){
                    book[i] =1;
                    judge[num] = i;
                    dfs(num+1);
                    judge[num] = 0;
                    book[i]=0;
                }
            }
        }
        public static boolean check(){
            for(int i=0;i<7;i++){
                for(int j=i+1;j<8;j++){
                    if(Math.abs(i-j)==Math.abs(judge[i]-judge[j]))
                        return false;
                }
            }
            return true;
        }
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值