首页 > 其他分享 >蓝桥杯2019 估计人数

蓝桥杯2019 估计人数

时间:2023-11-12 15:45:12浏览次数:29  
标签:int 路径 矩阵 蓝桥 2019 方格 人数 ID

蓝桥杯2019 估计人数

题目描述

给定一个 \(N \times M\) 的方格矩阵,矩阵中每个方格标记 0 或者 1 代表这个方格是不是有人踩过。

已知一个人可能从任意方格开始,之后每一步只能向右或者向下走一格。走了若干步之后,这个人可以离开矩阵。这个人经过的方格都会被标记为 1,包括开始和结束的方格。注意开始和结束的方格不需要一定在矩阵边缘。

请你计算至少有多少人在矩阵上走过。

输入格式

输入第一行包含两个整数 \(N\)、\(M\)。
以下 \(N\) 行每行包含一个长度为 \(M\) 的 01 串,代表方格矩阵。

输出格式

输出一个整数代表答案。

样例 #1

样例输入 #1
5 5
00100
11111
00100
11111
00100
样例输出 #1
3

提示

对于所有评测用例, \(1 \leq N, M \leq 20\), 标记为 1 的方格不超过 \(200\) 个。

蓝桥杯 2019 年国赛 A 组 G 题(C 组 H 题)。

解法

此题为可重复的最小路径覆盖问题。
首先先来了解一下什么是不可重复最小路径覆盖问题。

不可重复路径覆盖问题
此问题是指,在一个有向无环图上用最少几条不相交的路径可以将所有的点都覆盖住。
通常的解法是二分图匹配,可以用匈牙利法实现或者用网络流实现。
将图中所有的点拆分成两个,点A拆成点\(A_1 , A_2\),如果图中有边<u , v>,那么就连接\(<u_1 , v_2>\),然后求得此图的最大匹配,点数n-最大匹配就是答案。
原因是,将每个点都看作一条长度为0的路径,拆分之后的点看作是路径的首部和尾部,那么二分图上的一次匹配就是将两条路径首尾相接,连接到一起。
所以最大匹配数就是可以省去的路径数。
可重复路径覆盖问题
如果将路径不可交改为路径可交,那么只需要将“原图中<u , v>有边则连接”改为“原图中<u,v>可达则连接”。
可以理解为跳过了路径重叠的部分。

#include<bits/stdc++.h>
using namespace std;
int n , m;
int Match[810] , Visit[810] , Map[810][810];
char String[30][30];

inline int ID(int a , int b , int k) { return (a - 1) * m + b + n * m * k; }

int Dfs(int x)
{
	for(int i = 1 ; i <= n * m ; ++i)
	{
		if(Map[x][i + n * m] && !Visit[i + n * m])
		{
			Visit[i + n * m] = 1;
			if(!Match[i + n * m] || Dfs(Match[i + n * m]))
			{
				Match[i + n * m] = x;
				return 1;
			}
		}
	}
	return 0;
}

int main()
{
	cin >> n >> m;
	for(int i = 1 ; i <= n ; ++i)
		cin >> (String[i] + 1);
	for(int i = 1 ; i <= n ; ++i)
		for(int j = 1 ; j <= m ; ++j)
			if(String[i][j] == '1')
			{
				int a , b;
				a = i + 1; b = j;
				if(a < 1 || b < 1 || a > n || b > m || String[a][b] == '0');
				else
					Map[ID(i , j , 0)][ID(a , b , 1)] = 1;
				a = i; b = j + 1;
				if(a < 1 || b < 1 || a > n || b > m || String[a][b] == '0');
				else
					Map[ID(i , j , 0)][ID(a , b , 1)] = 1;	
			}
	for(int a = 1 ; a <= n ; ++a) for(int b = 1 ; b <= m ; ++b) if(String[a][b] == '1')
		for(int c = 1 ; c <= n ; ++c) for(int d = 1 ; d <= m ; ++d) if(String[c][d] == '1')
			if(!Map[ID(a , b , 0)][ID(c , d , 1)])
			{
				for(int s = 1 ; s <= n ; ++s) for(int t = 1 ; t <= m ; ++t)
					if(String[s][t] == '1' && Map[ID(a , b , 0)][ID(s , t , 1)] && Map[ID(s , t , 0)][ID(c , d , 1)])
					{
						Map[ID(a , b , 0)][ID(c , d , 1)] = 1;
						goto bk;
					}
				bk:;
			}
	// cout << Map[ID(2 , 3 , 0)][ID(1 , 3 , 1)] << '\n';
	int Answer = 0;
	for(int i = 1 ; i <= n ; ++i)
		for(int j = 1 ; j <= m ; ++j) if(String[i][j] == '1')
		{
			for(int a = 1 ; a <= n ; ++a)
				for(int b = 1 ; b <= m ; ++b)
					Visit[ID(a , b , 1)] = 0;
			if(!Dfs(ID(i , j , 0))) Answer++;
		}
	cout << Answer << '\n';
	return 0;
}

标签:int,路径,矩阵,蓝桥,2019,方格,人数,ID
From: https://www.cnblogs.com/sybs5968QAQ/p/17827268.html

相关文章

  • 【题解 P8763】[蓝桥杯 2021 国 ABC] 异或变换
    同楼上dalao做法:#include<iostream>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<cstdlib>#include<bitset>usingnamespacestd;constintN=1e4+10......
  • Web_BUUCTF_WriteUp | [极客大挑战 2019]EasySQL
    题目靶机界面URL:http://86ae5adf-d39e-47dd-b3da-1ae895847925.node4.buuoj.cn:81/分析先在交互界面随便输入用户名和密码试试,界面显示如下:此时的URL为http://86ae5adf-d39e-47dd-b3da-1ae895847925.node4.buuoj.cn:81/check.php?username=admin&password=123对多出的......
  • CSP-S2019 江西 题解
    为什么有\(5\)道题?[CSP-S2019江西]和积和简单化一下式子:\[(n+1)\times\sumA_i\timesB_i-(\sumA_i)\times(\sumB_i)\]其中\(A,B\)都是前缀和。[CSP-S2019江西]网格图naive的kruskal是很naive的,所以需要一点简单的优化。考虑其本质过程就是按照......
  • [极客大挑战 2019]BuyFlag 1(两种解法)
    题目环境:<br/><br/><br/>FLAGNEEDYOUR100000000MONEYflag需要你的100000000元F12瞅瞅源代码:<br/>if(isset($_POST['password'])){$password=$_POST['password'];if(is_numeric($password)){echo"pas......
  • CSP-2019-S 题解
    做了这套题,如果是让现在的我当时去考的话应该一共可以有450分,格雷码,括号树,树的重心都可以做,树上的数可以有10分,Emiya至少可以有76分,划分也可以有64分。看OIerDB上可以有166名的好成绩。我的代码合集:洛谷/云剪贴板[CSP-S2019]格雷码首先是格雷码有一个很好的生......
  • 【每日例题】蓝桥杯 c++ 手机尾数
    手机尾数题目30年的改革开放,给中国带来了翻天覆地的变化。2011全年中国手机产量约为11.72亿部。手机已经成为百姓的基本日用品!给手机选个好听又好记的号码可能是许多人的心愿。但号源有限,只能辅以有偿选号的方法了。这个程序的目的就是:根据给定的手机尾号(4位),按照—定的规则......
  • [BalticOI 2019 Day2] 汤姆的餐厅
    [BalticOI2019Day2]汤姆的餐厅题目背景译自BalticOI2019Day2T1.Tom'sKitchen题目描述Tom'sKitchen是一家非常受欢迎的餐厅,其受欢迎的原因之一是每份菜都由至少$K$名厨师进行准备。今天有$N$份菜需要准备,第$i$份菜的准备时间是$A_i$小时。Tom可以......
  • Math.round(-2019.5)的结果是 -2019
    Math.round()函数返回一个数字四舍五入后最接近的整数如果参数的小数部分大于0.5,四舍五入到相邻的绝对值更大的整数如果参数的小数部分小于0.5,四舍五入到相邻的绝对值更小的整数如果参数的小数部分等于0.5,四舍五入到相邻的在正无穷(+∞)方向上的整数。例:x=Math.round(2019.49);......
  • 通过一道题目带你深入了解WAF特性、PHP超级打印函数、ASCII码chr()对应表等原理[RoarC
    题目环境:<br/>依此输入以下内容并查看回显结果1+11'index.phpls<br/><br/>到这里没思路了F12查看源代码<br/>一定要仔细看啊,差点没找到,笑哭访问calc.php文件<br/>果然有点东西PHP代码审计error_reporting(0);关闭错误报告通过GET方式传参的参数numsho......
  • [ZJCTF 2019]NiZhuanSiWei 1
    1.进入页面2.从代码中可以看出要求,以get方式传递text,file,password三个参数。3.第一层验证if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"))  传入text,而且file_get_contents($text,'r')之后内容为“welcometothezjctf”  利用php伪协......