东华OJ-基础题-131-8皇后·改(C++)

  • 问题描述
    规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
  • 输入说明
    一个8*8的棋盘。
    数据规模和约定
      棋盘上的数字范围0~99
  • 输出说明
    所能得到的最大数字和
  • 输入范例
cpp 复制代码
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
  • 输出范例
cpp 复制代码
260

感想:写个函数判断row行column列是否可以放皇后;进行dfs,用数组存每行的列数。

代码如下:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int n = 8;
vector<vector<int>> chessBoard(n,vector<int>(n));
vector<int> col_pos(n);//某i行的列位置为col_pos[i];
int max_sum = INT_MIN;

//检查第row行、第column列是否可放皇后 (based - 0)
bool isValid(int row,int column) {
    for(int i = 0; i<row; ++i) {
        if(col_pos[i]==column|| row - i == abs(column - col_pos[i]))
            return false;//同列或斜对角已有皇后
    }
    return true;
}

void dfs(int row,int currentSum) {
    if(row == n) { //终止条件
        if(currentSum > max_sum)
            max_sum = currentSum;
        return;
    }

    for(int col = 0; col<n; ++col) {
        if(isValid(row,col)) {
            col_pos[row] = col;
            dfs(row+1,currentSum + chessBoard[row][col] );
        }
    }

}



int main() {
    for(int i = 0; i<n; ++i) {
        for(int j = 0; j<n; ++j) {
            cin>>chessBoard[i][j];
        }
    }
    dfs(0,0); // 从第0行开始,初始和为0
    cout<<max_sum<<endl;
    return 0;
}
相关推荐
huang5791471 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_1 小时前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法
Elsa️7462 小时前
算法一周刷题总结
c++·算法
风合星语2 小时前
2026 机器人工程实例(五):让 Allegro Hand 在 MuJoCo 中完成接触抓取——抓取状态机、稳定抬升与受控释放
c++·python·机器人·仿真
小羊没烦恼!2 小时前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#
小小程序猴12 小时前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法
云上先途2 小时前
标签化服务适合哪些人?常见适用场景一次讲清
大数据·人工智能·算法·音视频
welfare9622 小时前
新号别搞:内存管理+模板初阶+STL简介
开发语言·c++
彧azz2 小时前
DFS与BFS:图遍历的两大核心算法
数据结构·学习·算法·深度优先·广度优先
宣宣猪的小花园.3 小时前
【机器学习】损失函数与梯度下降:机器如何通过“犯错”不断变好
人工智能·算法·机器学习