分解质因数
题目
-
问题描述
规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
8皇后问题:在一个 8 × 8 的国际象棋棋盘上放置 8 个皇后,要求:
任意两个皇后 不能在同一行
任意两个皇后 不能在同一列
任意两个皇后 不能在同一条对角线
也就是说,任何一个皇后都 不能攻击到另一个皇后。 -
输入说明
一个8*8的棋盘。
数据规模和约定
棋盘上的数字范围0~99 -
输出说明
所能得到的最大数字和 -
输入范例
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
解题思路
- 本题思路是利用 回溯搜索(DFS)+ 状态标记 + 最优值更新 来解决带权值的 8 皇后问题。在经典 8 皇后的基础上,每个位置都有一个权值,目标是在满足皇后互不攻击的前提下,使所选位置的数字之和最大。具体做法是:从第 0 行开始逐行放置皇后,每一行尝试放在某一列 c,前提是该列、主对角线(row - col)、副对角线(row + col)均未被占用。通过 col[]、drag1[]、drag2[] 三个数组进行标记来快速判断是否合法。如果当前位置可以放置皇后,则标记该位置并递归进入下一行,同时将当前格子的权值累加到 sum 中;当递归到第 8 行(即成功放置 8 个皇后)时,用当前路径的总和更新全局最大值 res。整个过程通过回溯遍历所有合法的摆放方案,从而找到最大权值和。
整体代码
cpp
#include<bits/stdc++.h>
using namespace std;
int board[8][8];
bool col[8]={false};
bool drag1[20]={false};
bool drag2[20]={false};
int res=0;
void dfs(int row,int sum){
if(row==8){
res=max(res,sum);
return;
}
for(int c=0;c<8;c++){
if(!col[c]&&!drag1[row-c+7]&&!drag2[row+c]){
col[c]=drag1[row-c+7]=drag2[row+c]=true;
dfs(row+1,sum+board[row][c]);
col[c]=drag1[row-c+7]=drag2[row+c]=false;
}
}
}
int main(){
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
cin>>board[i][j];
}
}
dfs(0,0);
cout<<res<<endl;
return 0;
}
注意事项
- 注意与经典8皇后的区别:不再是统计方案数,而是求最大权值和,需要用 res = max(res, sum) 更新答案。
英文段落翻译
自己翻译
计算机视觉旨在是计算机能够理解和分析图像和视频的信息。随着深度学习技术的发展,计算机视觉已经实现了显著的进步。在例如图像分类,对象识别和语义分割等任务中卷积神经网络完成的十分好。通过在大型标签数据集中训练,模型能够学习复杂的视觉特征。近几年,计算机视觉技术已经被广泛的应用在例如自动驾驶安全监督和工业检查等领域中了。例如在自动驾驶系统中,视觉模型能够识别道路车辆和行人帮助系统做出安全的决定。
单词打卡

下一篇
待续