38行代码AC——UVA-167The Sultan‘s Successors(八皇后问题,附视频讲解)
最近备考蓝桥,学习到递归模块,从最基本的八皇后及其变种开始刷起(如果可以穿越,我一定要抓到发明递归的那个人,然后把他干掉,造福后世的算法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(八皇后问题,附视频讲解)相关推荐
- 10行代码AC——UVA 11538-Chess Queen(数学规律+数列,附详细讲解)
励志用尽量少的代码做高效表达 提交(题目)连接-->UVA-11538 题目大意 求在n*m棋盘上放2个不一样的皇后,且他们相互攻击的方案数,也就是说,求2个不同的皇后在同一行.同一列或同一对角 ...
- The Sultan's Successors (八皇后)DFS
The Sultan's Successors 原题链接https://vjudge.net/contest/345248#problem/F 八皇后问题,既在8*8的棋盘中放置8个皇后,每行,每列, ...
- 10行代码AC——UVa 10940(Throwing cards away II 数学规律+约瑟夫环)
励志用尽量少的代码做高效表达 题目(提交)链接-->UVa-10940 问题分析 本题的时间要求是3s,但极限数据量为50W*50W,一般来说,3s的时间只能支持不到三千万次的运算,也就是说,即 ...
- 38行代码AC——L1-025 正整数A+B (15分)(~解题报告~)
立志用更少的代码做更高效的表达 题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000].稍微有点麻烦的是,输入并不保证是两个正整数. 输入格式: 输入在一行给出A和B,其间以空 ...
- 12行代码AC——UVa 151 - Power Crisis(约瑟夫环)
励志用尽量少的代码做高效表达. 提交(题目)链接-->UVa-151 题意 有n个电场,按约瑟夫环的规则断电,最后一个不断电,要求将最后一个断电的电场停在13号. 分析 约瑟夫环公式:f(N,M ...
- 12行代码AC——L1-058 6翻了(15分)
立志用更少的代码做更高效的表达 "666"是一种网络用语,大概是表示某人很厉害.我们很佩服的意思.最近又衍生出另一个数字"9",意思是"6翻了&quo ...
- 16行代码AC——例题6-4破损的键盘(Broken Keyboard,UVa 11988)——解题报告
励志用尽量少的代码做高效的表达. 题目(提交)链接→UVa-11988 题目大意: 输入一个字符串,输出在原本应该是怎么样的? 具体方法是: 若读取到'[', 则执行Home键:将光标移到行首. 若读 ...
- 15行代码AC——1019 数字黑洞 (20分) 甲级1069. The Black Hole of Numbers (20)(解题报告)
立志用更少的代码做更高效的表达 PAT甲级最优题解-->传送门 Pat乙级最优化代码+题解+分析汇总-->传送门 给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非 ...
- 7行代码AC——1010 一元多项式求导 (25分)
立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1 .) 输入格式: 以指数递降 ...
最新文章
- 1030 完美数列(two pointers解法)
- 对LinqtoExcel的扩展 【数据有限性,逻辑有效性】
- get请求中文乱码问题
- VTK:InfoVis之WordCloudDemo
- 【视频】谷歌大佬30分钟让你入门机器学习(2019谷歌I/O资源分享)
- 剑指offer之26-30题解
- codeforces gym-101741 Elevator 动态规划、单调队列
- for-each循环的认识、定义、适用对象、举例、局限性
- linux监听端口无响应,linux – tomcat运行,但是8080端口没有响应
- Java数据库连接池c3p0和druid
- PLSQL_动态语句的解析(概念)
- 免费车型车系品牌api
- 《嵌入式 - STM32开发指南》手把手教你搭建STM32开发环境 [Linux版 - 1]
- 关于计算机安全的英语文章,计算机专业英语期末论文
- mongodb副本集集群中节点出现recovering状态解决办法
- CCNP课堂练习一:详解交换机vlan的介绍及通过交换机从逻辑上划分区域配置
- Python爬虫新手进阶版:怎样读取非结构化网页、图像、视频、语音数据
- 神经网络计算相似度,神经网络对比
- 口布杯花的60种叠法_史上最全的口布花折法教程,简单实用!超美呦~
- 【Pytorch Lighting】第 10 章:扩展和管理培训