蓝桥杯算法提高VIP-棋盘多项式

2023-11-04

题目

题目链接

题解

DFS。


整体思路:
横向分块,如下:
在这里插入图片描述
我们只需要按连通块的序号去深搜即可,对于每个连通块,我们可以选择其中的任何一个空格作为放“車”的位置,或者选择不在这个连通块中放“車”。因此,我们的问题转化为在dfs中如何确定连通块,如何确定连通块中的哪个格子可以放,哪个格子不能放。

解决连通块的确定,只需要解决左端点和右端点的确定即可,那么我们不妨去遍历这一行,遇到洞就说明分开了两个连通块(不严谨的说)。对于确定好的一个连通块,我们对这个连通块中的空格再进行遍历,这次遍历的目的是为了确定连通块中的一个空格作为这个要选择的位置,将选中的位置进行标记,再就可以进行深搜下一个连通块了,同时不能忘记不选的情况,此时不需要对记录已放“車”数量的变量进行++

为了方便连通块的查找,我直接将dfs函数的第一个参数设置为行号,第二个参数设置为列号,这个列号对应的位置的左侧一定是一个洞,也就是说这个列号对应着一个连通块的左端点,从这个列向右侧遍历,遇到洞就说明这个连通块的右端点也确定了,就可以进行选择空格放“車”了。

我们进行标记的用处在于,每次要确定一个连通块中的空格能不能选时,需要向上面已经搜完的行去遍历。我就看看我如果选这个位置的空格,那么它上面会不会已经有“車”了,其实有“車”也不要紧,先遇到洞也可以隔开俩“車”的攻击。通过从当前列向列号小的列遍历,看是不是满足条件,满足条件才能选中当前这个位置的空格。


注意如何变行。

代码

#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int n, ans, bound, sum, mp[N][N], vis[N][N];

bool check(int row, int col) {
	int i = row-1; // 从上一行查起 
	for(;i >= 0;i --) {
		if(vis[i][col]) break; // 如果遇到車了,就跳出 
		if(!mp[i][col]) {i = -1; break;} // 如果遇到洞了,说明没有車在攻击范围内,i=-1是为了统一返回的条件表达式 
	}
	return  i < 0;
}

void dfs(int row, int col) { // 洞右侧紧邻的一个空格 
	if(sum >= bound) {ans++; return ;}
	if(col >= n) row ++, col = 0; // 变行操作 
	if(row >= n) return ;
	
	int i = col;
	for(;i < n;i ++) if(!mp[row][i]) break; // 找到洞了 
	
	sum ++;  // 选了,所以加一 
	for(int j = col;j < i;j ++) {
		if(check(row, j)) { // 检查,满足当前这一行上面没有車在攻击范围内,就可以dfs 
			vis[row][j] = 1; // 标记 
			dfs(row, i+1); // i+1为下一个连通块的左端点(当然也可能还是洞,但是没有影响) 
			vis[row][j] = 0; // 回溯 
		}
	}
	sum --; // 回溯,下面进行不选操作 
	
	dfs(row, i+1); // 此连通块内的空格,都不选 
}

int main()
{
	cin>>n;
	for(int i = 0;i < n;i ++)
	for(int j = 0;j < n;j ++)
	cin>>mp[i][j];
	
	for(int i = 1;i <= n*n;i ++) {
		
		memset(vis, 0, sizeof vis);
		ans = sum = 0;
		bound = i;
		
		dfs(0, 0);
		
		if(ans == 0) break;
		cout << ans << endl;
	}
	
	return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯算法提高VIP-棋盘多项式 的相关文章

  • [蓝桥杯][2013年第四届真题]幸运数

    题目 题目链接 题解 两种方法 DFS 模拟 先讲大佬的DFS 再讲我的模拟 分别对应代码1和代码2 代码3是根据大佬代码改进的我的模拟 推荐代码1和代码3 从幸运数字3开始每次都将 通过幸运数字更新过的数组中当前幸运数字的下一个数字 作为
  • 蓝桥杯2017年第八届真题-发现环

    题目 题目链接 题解 并查集 DFS 并查集比较明显 因为要判断有没有环 思路也很简单 若不停加边 若两个点的fa是一样的 则说明再加上这两点之间的直接 边就会出现环 因此这两个点一定位于环上 我们以两点中的其中一个点为起点 dfs寻找另一
  • 蓝桥杯2020年第十一届国赛真题-重复字符串

    说在前面 本题的标程是存在问题的 下面会分析标程与正确程序 题目 题目连接 题解 思维吧 整体思路 将字符串分割成k段 假设每段m个字符 我们统计每段相同位置的每种字符出现的次数 每段都统计上后 每个位置 0 m 1 都取出现次数最多的字符
  • 蓝桥杯2015年第六届真题-机器人塔

    题目 题目链接 题解 DFS 二进制枚举 经典dfs之一 好像比较经典的那个同型dfs题叫 符号三角形 可以看出上面一行的安排方式均由下面一行的安排方式决定 因此我们只要定好最后一行 那么上面的安排方式均可以由下行推出 且最后一行固定则整个
  • 2017年蓝桥杯B组C/C++省赛-K倍区间

    题目 题解 思维 暴力的话是会超时的 但也可以骗点分 采用差分数组暴力 讲一下AC思路 统计出来每个前缀和取模 k k k后结果的个数 比如 c n t
  • 2018年蓝桥杯省赛-日志统计

    题目 题目链接 题解 贪心 尺取 首先按照时间从小到大 对输入的每一组 t s ts ts和 i d id id进行排序 遍历每一对 取当
  • 蓝桥杯2015年第六届真题-奇怪的数列

    题目 题目链接 题解 实现题 太简单了 就是遍历字符串 拼接一下就可以了 代码 include
  • 2020年蓝桥杯国赛-答疑

    题目 题目链接 题解 贪心 有点像 排队打水 比较好想 而且我甚至都能证明 贪心思路 按照 s a e s a e s a e 从小到大排序即可 证明 首先 每个人的
  • 蓝桥杯算法提高VIP-棋盘多项式

    题目 题目链接 题解 DFS 整体思路 横向分块 如下 我们只需要按连通块的序号去深搜即可 对于每个连通块 我们可以选择其中的任何一个空格作为放 車 的位置 或者选择不在这个连通块中放 車 因此 我们的问题转化为在dfs中如何确定连通块 如
  • 蓝桥杯算法训练VIP-单词接龙

    题目 题目链接 题解 DFS 真没想到居然是暴力搜索 感觉时间复杂度根本不允许啊 大致思路 每次递归都遍历全部字符串 对于每个字符串 枚举要匹配的长度 在此长度下依次匹配原串的尾与遍历到的字符串的头 完全相同说明可以匹配当前长度 就继续深搜
  • [蓝桥杯][2014年第五届真题]兰顿蚂蚁

    题目 题目链接 题解 DFS 没什么难的吧 可能实现的时候用时长短 代码简洁程度不同而已 代码 include
  • 蓝桥杯2015年第六届真题-广场舞

    说在前面 其他博客中的代码应该保证不了健壮性 我这个 应该 可以 题目 题目链接 题解 数学 计算几何 提示 这题默认好像是顺时针或逆时针输入坐标 也就是说先后输入的两个点一定是多边形的一条边 前置知识 PNPoly算法 何为PNPoly算
  • 2016年蓝桥杯省赛C/C++ A组-寒假作业

    题目 现在小学的数学题目也不是那么好玩的 看看这个寒假作业 每个方块代表1 13中的某一个数字 但不能重复 比如 6 7 13 9 8 1 3 4 12 10 2 5 以及 7 6 13 9 8 1 3 4 12 10 2 5 就算两种解法
  • 2017年蓝桥杯B组C/C++省赛-分巧克力

    题目 题目链接 题解 二分 想到二分比实现二分要难点 可行解部分可以与不可行解部分完美地分隔开来 绿色部分是分成的巧克力比较小时都可以满足 而大于一定程度的时候就不可行了 所以可以将其抽象成小于可行 大于不可行的二分问题 在判断时 遍历全部
  • 2019年蓝桥杯省赛-数的分解

    题目 题目链接 题解 DFS 一定看清要求 3 个 不同 正整数 正整数中不能包括2和4 满足加法交换律的算式属于一种情况 代码 include
  • 2021蓝桥杯模拟赛-受伤的皇后

    题目 题目链接 题解 DFS 八皇后问题改编而已 加入判断左上三格内和右上三格内是否存在皇后 代码 include
  • 第二届蓝桥杯-最小公倍数问题

    题目 题目链接 题解 数学 高精度 如果直接按照计算多个数连续计算最小公倍数 那么显然要经过高精度乘法 高精度除法 两个高精度过于麻烦了 换个思路 我们将每个数都分解质因数 全部数的最小公倍数必然由分解得到的质因数相乘得到 而且构成最小公倍
  • 【限时免费】20天拿下华为OD笔试之【DFS/BFS】2023B-寻找最大价值的矿堆【欧弟算法】全网注释最详细分类最全的华为OD真题题解

    DFS BFS 2023B 寻找最大价值的矿堆 题目描述与示例 给你一个由 0 空地 1 银矿 2 金矿 组成的的地图 矿堆只能由上下左右相邻的金矿或银矿连接形成 超出地图范围可以认为是空地 假设银矿价值 1 金矿价值 2 请你找出地图中最
  • 2021年蓝桥杯A组省赛-左children右sibling

    CXXX有毛病 左孩子右兄弟 字眼很敏感吗 题目 题目链接 题解 贪心 DFS 以 u u u 为根的子树选择包含节点最多的以 v v v 为根的子树作为最后连接的右兄弟能保证树向下延展的最多 所以重点转换为了计算以
  • 滑雪(记忆化搜索)

    题目 题解 记忆化搜索模板题 记忆化搜索的核心 本质是带剪枝的深搜 当某点的dp已赋值时 返回该值 其他情况进行深度搜索 模板 dfs u点 if u点的 dp 已经有值了 return u点的 dp 值 else 说明第一次到达u 则为u

随机推荐

  • [从零开始学DeepFaceLab-1]: 架构-概述与功能简介

    目录 1 什么是DeepFaceLab 1 1 什么DeepFaceLab 1 2 Deepfacelab的适用范围
  • k8s开发基础-WeopsWay自动化运维平台之多k8s集群管理

    多种公有云以及本地虚拟机 k8s容器环境等 平时管理起来也不是很方便 想找一个免费的并且适合自己的多云管理平台又很难 这也是决定自己扣钉的初衷 从运维的角度思考开发 从开发的角度思考运维 疫情的这两年 感觉时间过得很快 但愿留点看得见的东西
  • oracle-CREATE OR REPLACE PROCEDURE存储过程使用

    查阅博文 https www cnblogs com wolfplan p 4004624 html 其中描述比较清晰 建议查阅此链接博文 也可查阅此 https www cnblogs com ao xiang p 6640827 htm
  • OpenMV颜色阈值设置

    OpenMV提供了两者阈值设置方案 分别是阈值编译器和直方图的方式选择阈值 阈值编译器 优点 所寻找到的目标颜色更加合理 其他相似颜色区域的干扰比较小 缺点 调节LAB的最大最小值比较花费时间 直立方图恰好相反 他很容易找到LAB的最大最小
  • 分库分表实战(8):激流勇进 — 千万级数据优化之加缓存

    V X ruyuanhadeng获得600 页原创精品文章汇总PDF 前 言 经过前面索引和sql的优化后 现在查询速度快的飞起 然后 我们继续回归到了日常需求的开发中 3个月过后 订单表的数据已经达到5000万了 不过sql一次查询的时间
  • 操作系统内存管理详细总结

    1 内存管理的概念 内存管理 Memory Management 是操作系统设计中最重要和最复杂的内容之一 虽然计算机硬件一直在飞速发展 内存容量也在不断增长 但是仍然不可能将所有用户进程和系统所需要的全部程序和数据放入主存中 所以操作系统
  • github镜像站【转载】

    GitHub 在国内经常会出现无法访问的情况 下面分享几个 GitHub 镜像站供大家使用 全局加速 可直接访问站点 查看代码等操作 支持Git clone 网页或命令行下载zip Releases等 链接 https help kgith
  • Uncaught TypeError: Illegal invocation

    今天使用JavaScript的setTimeout遇到一个问题 如下是原代码 setTimeout raiseEle setCustomValidity 1000 raiseEle是一个HTMLInputElement 标题错误是在Chro
  • C#获取(友好)串口名称

    每次使用串口都要进去设备管理器找到对应的串口号 不管你们烦不烦 反正我很暴躁 于是就有了自己做一个串口助手的想法 那C 怎么来自动获取 友好 串口名称 拒绝打开设备管理器呢 通过读取设备管理器里的条目来实现 下面的代码解决问题 获取可用端口
  • LeetCode 217. 存在重复元素

    题目链接 点击这里 class Solution public bool containsDuplicate vector
  • 基于python的数字图像处理--学习笔记(一)

    基于python的数字图像处理 学习笔记 一 图像处理python常用库和函数 1 opencv python库 2 opencv python常用函数 图像处理python常用库和函数 使用opencv python读取图片数据 并使用n
  • 解决WinXP系统无法打开网上邻居方法

    在网络维护中 经常会遇到打不开网上邻居的问题 现整理了打不开网上邻居的处理方法 供大家在遇到此问题时参考 下面是打不开网上邻居的处理方法 1 安装NWlinkIPX SPX NetBIOSCompatibleTransportProtoco
  • 友元函数的定义和使用

    下面是友元函数的定义和使用 学生姓名 成绩 include
  • shell 的here document 用法、输入/输出重定向

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 什么是Here Document Here Document 是在Linux Shell 中的一种特殊的重定向方式 它的基本的形式如下 cmd
  • Python控制命令行打印的方法

    禁止结果打印 import sys def block print sys stdout open os devnull w 继续结果打印 import sys def enable print sys stdout sys stdout
  • 【ssh】ssh远程登录:no hostkey alg报错处理

    背景 centos系统 在ssh远程登录出现no hostkey alg 的报错 查询资料是因为ssh版本高低连接的原因 解决办法 一 通过重启sshd重新生成key rm rf etc ssh ssh key systemctl rest
  • 基于TF-Agent的回合策略梯度算法模型训练Atari游戏

    在上一篇博客中 我用Tensorflow的Agent库的DQN模型来对Atari的PONG游戏进行训练 效果很好 这次我打算测试一下回合策略梯度模型 看是否也能取得相同的效果 关于回合策略梯度算法的介绍 可以见我之前的另一篇博客强化学习笔记
  • Python+uiautomator2手机UI自动化测试实战 --1. 环境搭建

    转自 https blog csdn net ricky yangrui article details 81414870 一 简介 uiautomator2是一个python库 用于Android的UI自动化测试 其底层基于Google
  • Python POST实现发送Ajax的两个坑

    今天给写的应用做测试 服务器单元测试搞定了 要做功能测试和验收测试 功能测试需要模拟Ajax 验收测试需要Selenium 我之前的Selenium都是用Python 一想的话那就都用Pyhton了 结果一上来就掉到了Python的坑里 g
  • 蓝桥杯算法提高VIP-棋盘多项式

    题目 题目链接 题解 DFS 整体思路 横向分块 如下 我们只需要按连通块的序号去深搜即可 对于每个连通块 我们可以选择其中的任何一个空格作为放 車 的位置 或者选择不在这个连通块中放 車 因此 我们的问题转化为在dfs中如何确定连通块 如