首页 > 其他分享 >P2427 题解

P2427 题解

时间:2023-09-28 19:13:40浏览次数:55  
标签:字符 int 题解 每次 MAXN ans date P2427

洛谷链接

题目简述

给定 \(N \times M\) 的字符矩阵,有 \(Q\) 次询问,对于每次询问给出 \(x,y\),求以 \((x,y)\) 为中心的最大正方形边长且正方形中字符均相同

思路

看到数据范围较小,可以考虑深搜解决,约掉常数的时间复杂度最坏为 \(O(q \times \min(n,m))\),勉强可以通过。(不过代码跑的飞快,数据还是有点水的。)

考虑深搜的实现,以 \((x,y)\) 为中心开始搜,每次边长增加 \(2\),即距 \((x,y)\) 的距离 \(d\) 每次增加 \(2\)。对于每次增加,判断四周的字符是否与中心 \((x,y)\) 相同,不相同终止搜索即可,记得每次增加完边长后,实时更新 \(ans\)!

下面是代码实现:

#include<iostream>
using namespace std;
#define MAXN 1005 // 数组大小。

int n, m, q, ans = 0, x, y; // 题目给定变量及辅助变量。
char mp[MAXN][MAXN]; // 存储字符矩阵。

// 开搜,传入中心坐标及距中心距离 date。
void dfs(int x, int y, int date) {
	if(!(y - date >= 1 && y + date <= m && x - date >= 1 && x + date <= n)) return; // 出现越界,直接终止。
   // 分别搜索上、下、左、右四个边。
	for(int i = y - date; i <= y + date; i ++)
		if(mp[x - date][i] != mp[x][y]) return;
	for(int i = x - date; i <= x + date; i ++)
		if(mp[i][y - date] != mp[x][y]) return;
	for(int i = y - date; i <= y + date; i ++)
		if(mp[x + date][i] != mp[x][y]) return;
	for(int i = x - date; i <= x + date; i ++)
		if(mp[i][y + date] != mp[x][y]) return;
	ans = date * 2 + 1; // 更新 ans 的值。
	dfs(x, y, date + 1); // 接着搜。
	return;
}

int main() {
	scanf("%d %d %d", &n, &m, &q);
	for(int i = 1; i <= n; i ++) 
		for(int j = 1; j <= m; j ++) 
			cin >> mp[i][j];
	while(q --) {
		scanf("%d %d", &x, &y);
		x ++, y ++, ans = 1; // 因为题目中下边从 0 开始,所以都先自加 1,另外初始化 ans。
		dfs(x, y, 1); // 深搜。
		printf("%d\n", ans); // 输出答案,记得换行。
	}
	return 0;
}

AC 记录

\[\texttt{The End!} \]

标签:字符,int,题解,每次,MAXN,ans,date,P2427
From: https://www.cnblogs.com/So-noSlack/p/17736359.html

相关文章

  • AT_arc111_a 题解
    洛谷连接&Atcoder链接题目简述给定两个数\(n\)和\(m\),输出\(\left\lfloor\frac{10^n}{m}\right\rfloor\bmodm\)的值。数据范围:\(n\le10^{18},m\le10^4\)思路首先看到数据范围还是很大的,直接快速幂会炸,所以需要一些优化操作。推理如下:\[\left\lfloor\frac{10^n}......
  • AT_agc019_b 题解
    洛谷链接&Atcoder链接。题目简述给定一个字符串\(A\),可以选择区间\([i,j]\)翻转一次,求能得到多少本质不同的字符串。(\(A\)的长度不超过\(2\times10^5\))。思路首先解释本质不同的含义,即不完全相等的两个字符串(可能\(A\)是\(B\)的字串)。如果想直接求得答案显然是不......
  • P1989 无向图三元环计数 题解
    P1989无向图三元环计数题解考虑对无向图的边定向:对于每一条无向边,度数小的点向度数大的点连边,如果读书相等则按编号大小确定。这样枚举一个\(u\),再枚举它的出点\(v\),接着枚举\(v\)的出点\(w\),如果存在一个\(w\),\(u\)向它连边,那么\((u,v,w)\),就对应了原图中的一个三......
  • SOJ1835 题解
    题意给出一个\(1,\dots,n+1\)的排列\(v_{1},\dots,v_{n+1}\)与两组权值\(a_{1,\dots,n},b_{1,\dots,n}\)。满足\(v_{n+1}=n+1\)。构造一张\(n+1\)个点的有向图:对于\(i=1,\dots,n\),从\(i\)向\(i+1\)连一条权值为\(a_i\)的边;对于\(i=1,\dots,n\),找到最小的\(i......
  • LOJ 6479 [ICPC World Finals 2017] 小小水管工 Son of Pipe Stream 题解
    更好的阅读体验题意原题链接给出\(n\)个城市和\(m\)条双向管道,以及两个实数\(v\)和\(a\)。有两种液体,分别是水和Flubber(下面简写为W和F)。\(1\)号和\(2\)号城市分别生产Flubber和水,并通过管道流入\(3\)号城市。对于一条管道,其中可以同时存在两种液体,但是方向......
  • Jenkins问题解决_控制台输出:Windows下中文乱码,文本方式查看显示正常
    背景使用Git克隆代码时出现错误,控制台输出内容为中文乱码,文本方式查看显示正常Jenkins版本:2.423原因Jenkins内JAVA编码设置问题查看jenkins编码格式系统管理——>系统信息,查找sun.jnu.encoding字段。如果不是UTF-8,就可能导致中文支持有问题(GBK等支持度不够)。解决设......
  • 题解 [HEOI2016/TJOI2016] 排序
    题目链接看到这道题按照套路首先想到二分答案(即二分\(q\)位置上的数,记作\(mid\))。再按照套路将大于\(mid\)的数字设为\(1\),将等于\(mid\)的数设为\(2\),小于\(mid\)的数字设为\(0\)。那么对于区间\([l,r,0]\)操作,应该先讲\(0,1,2\)的数量找出来,然后按照从小到大......
  • 题解 CF1873H【Mad City】
    其他题解怎么又Tarjan又Dijkstra的,这是div4H的样子吗,来个简单好写的做法。题面里的人名太复杂了,本题解中称为警察和小偷。注意到,如果小偷成功到达了环上,那么一定不会被警察抓到。因为小偷知道警察下一步会走到哪里,他可以执行相同的操作(顺时针/逆时针/静止),使得他和警察之间......
  • [ARC124C] LCM of GCDs 题解
    题面给定\(N\)个正整数对\((a_i,b_i)\)和两个初始为空的集合\(S,T\),你可以选择将每个数对的两个元素划分到两个不同的集合中。求\[\max\operatorname{lcm}(\gcd\limits_{x\inS}x,\gcd\limits_{y\inT}y)\](\(1\leN\le50,1\lea_i,b_i\le10^9\))。题解首先,......
  • P4370 [Code+#4] 组合数问题2-题解-有关对数的小技巧
    20230927P4370[Code+#4]组合数问题2-solStatement传送门给你两个数\(n,k\),要求对于组合数\(C_{a}^{b}\)找到任何\(k\)个,让他们的和最大,且组合数各不相同,当且仅当\(a,b\)不完全相同时,组合数不同。Solution首先,很容易发现\(C_{n}^{m}\gtc_{n-1}^{m}\),所......