最近备考蓝桥,学习到递归模块,从最基本的八皇后及其变种开始刷起(如果可以穿越,我一定要抓到发明递归的那个人,然后把他干掉,造福后世的算法er,)。


题目大意

一个人,没孩子,要在死前分割财产,然后出了一个题,让人们做,也就是八皇后,8 * 8 的棋盘,棋盘有64个值,不同的放置方案有不同的和,求最大的和就可得出答案。


心路历程

读懂题意后很容易看出来这是一道八皇后的变种题,因此做此题前一定要理解且背写出八皇后代码。这里附上n皇后原理的视频讲解——>传送门

很快的敲出了八皇后的原码,与八皇后相比,本题第一个改变是如何求出每次递归结束后的Max值,下面两种方法都是可行的:要么列入参数递归, 要么在边界条件里+循环计算。

下一步是如何判断皇后之间是否产生冲突,不能用原八皇后的判定方法是因为这里需要计算Max值,因此定义数组vis,记录列、主对角线和副对角线的访问情况。

最后提交,AC,耗时3h左右。


代码展示

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int C[50], tot = 0, n = 8, nc = 0;
int vis[3][50]; //记录 列,主对角(y-x), 副对角(y+x) 访问情况
int board[8][8];
int max_score;
void search(int cur) {nc++;if(cur==n) {int score=0; for(int i=0;i<8;i++) score+=board[i][C[i]];max_score=max(max_score, score);}else for(int i=0;i<n;i++) {     //从第一列开始放皇后 if(vis[0][i] || vis[1][i-cur+n] || vis[2][i+cur]) //如果有冲突则结束 continue;C[cur]=i;vis[0][i]=vis[1][i-cur+n]=vis[2][i+cur]=1;           //这个皇后填放成功,设置成有冲突 search(cur+1);                //行数+1,填放下一个皇后 vis[0][i]=vis[1][i-cur+n]=vis[2][i+cur]=0;          //填放完毕,冲突取消,(回溯) }
}
int main() {int k; scanf("%d", &k); while(k--) {for(int i=0;i<8;i++) for(int j=0;j<8;j++) cin>>board[i][j]; memset(vis, 0, sizeof(vis));max_score=0;search(0);printf("%5d\n", max_score);}
return 0; }

如果这篇文章对你产生了帮助,就请给博主一个小小的赞吧!大家的点赞是我创作的最大动力!

38行代码AC——UVA-167The Sultan‘s Successors(八皇后问题,附视频讲解)相关推荐

  1. 10行代码AC——UVA 11538-Chess Queen(数学规律+数列,附详细讲解)

    励志用尽量少的代码做高效表达 提交(题目)连接-->UVA-11538 题目大意 求在n*m棋盘上放2个不一样的皇后,且他们相互攻击的方案数,也就是说,求2个不同的皇后在同一行.同一列或同一对角 ...

  2. The Sultan's Successors (八皇后)DFS

    The Sultan's Successors 原题链接https://vjudge.net/contest/345248#problem/F 八皇后问题,既在8*8的棋盘中放置8个皇后,每行,每列, ...

  3. 10行代码AC——UVa 10940(Throwing cards away II 数学规律+约瑟夫环)

    励志用尽量少的代码做高效表达 题目(提交)链接-->UVa-10940 问题分析 本题的时间要求是3s,但极限数据量为50W*50W,一般来说,3s的时间只能支持不到三千万次的运算,也就是说,即 ...

  4. 38行代码AC——L1-025 正整数A+B (15分)(~解题报告~)

    立志用更少的代码做更高效的表达 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空 ...

  5. 12行代码AC——UVa 151 - Power Crisis(约瑟夫环)

    励志用尽量少的代码做高效表达. 提交(题目)链接-->UVa-151 题意 有n个电场,按约瑟夫环的规则断电,最后一个不断电,要求将最后一个断电的电场停在13号. 分析 约瑟夫环公式:f(N,M ...

  6. 12行代码AC——L1-058 6翻了(15分)

    立志用更少的代码做更高效的表达 "666"是一种网络用语,大概是表示某人很厉害.我们很佩服的意思.最近又衍生出另一个数字"9",意思是"6翻了&quo ...

  7. 16行代码AC——例题6-4破损的键盘(Broken Keyboard,UVa 11988)——解题报告

    励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-11988 题目大意: 输入一个字符串,输出在原本应该是怎么样的? 具体方法是: 若读取到'[', 则执行Home键:将光标移到行首. 若读 ...

  8. 15行代码AC——1019 数字黑洞 (20分) 甲级1069. The Black Hole of Numbers (20)(解题报告)

    立志用更少的代码做更高效的表达 PAT甲级最优题解-->传送门 Pat乙级最优化代码+题解+分析汇总-->传送门 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非 ...

  9. 7行代码AC——1010 一元多项式求导 (25分)

    立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 设计函数求一元多项式的导数.(注:x​n(n为整数)的一阶导数为n*x​n-1​​ .) 输入格式: 以指数递降 ...

最新文章

  1. 1030 完美数列(two pointers解法)
  2. 对LinqtoExcel的扩展 【数据有限性,逻辑有效性】
  3. get请求中文乱码问题
  4. VTK:InfoVis之WordCloudDemo
  5. 【视频】谷歌大佬30分钟让你入门机器学习(2019谷歌I/O资源分享)
  6. 剑指offer之26-30题解
  7. codeforces gym-101741 Elevator 动态规划、单调队列
  8. for-each循环的认识、定义、适用对象、举例、局限性
  9. linux监听端口无响应,linux – tomcat运行,但是8080端口没有响应
  10. Java数据库连接池c3p0和druid
  11. PLSQL_动态语句的解析(概念)
  12. 免费车型车系品牌api
  13. 《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 1]
  14. 关于计算机安全的英语文章,计算机专业英语期末论文
  15. mongodb副本集集群中节点出现recovering状态解决办法
  16. CCNP课堂练习一:详解交换机vlan的介绍及通过交换机从逻辑上划分区域配置
  17. Python爬虫新手进阶版:怎样读取非结构化网页、图像、视频、语音数据
  18. 神经网络计算相似度,神经网络对比
  19. 口布杯花的60种叠法_史上最全的口布花折法教程,简单实用!超美呦~
  20. 【Pytorch Lighting】第 10 章:扩展和管理培训

热门文章

  1. tomcat源码运行
  2. 突破各个子系统,你就能对Linux了如指掌
  3. 操作系统的起源|开源运动的兴起
  4. 看完这篇还不清楚Netty的内存管理,那我就哭了!
  5. 力扣--替换后的最长重复字符
  6. 音视频技术开发周刊 87期
  7. Linux下的进程概论与编程二(进程控制)
  8. 微信扫一扫识物的技术揭秘:抠图与检索
  9. 使用BootStrap编写网页,如何设置全屏页面背景?
  10. 大剑无锋之post那么多优点,为什么还用get