codeforces510B
Fox And Two Dots
Fox Ciel 正在玩一个手机拼图游戏,被称之为 "Two Dots"。基础关卡是在一个大小为 n × m的棋盘上游戏,类似于这样:

每个单元格包含了一个具有某种颜色的点。我们将使用不同的大写拉丁字符,表示不同的颜色。
这个游戏的关键是,找到同色环。例如,考虑图上的 4 个蓝色点,它们形成了一个环。正式地,我们将一个点序列 d1, d2, ..., dk 称作一个环 ,当且仅当它满足以下的条件:
- 这 k 个点不同:如果 i ≠ j 那么 di 与 dj 不同。
- k 至少是 4。
- 全部的点属于同一种颜色。
- 对于全部的 1 ≤ i ≤ k - 1: di 和 di + 1 邻接,且 dk 与 d1 也邻接。单元格 x 和 y 被称为邻接,如果它们共享一条边。
判断图中是否存在一个环 。
输入
第一行包含两个整数 n 和 m (2 ≤ n, m ≤ 50),分别表示棋盘上的行数和列数。
接下来的 n 行,每行包含一个字符串,该字符串含有 m 个字符,表示每行中的点的颜色。每个字符都是一个大写拉丁字母。
输出
如果存在一个环,则输出 "Yes" ,否则输出 "No" 。
示例
3 4
AAAA
ABCA
AAAA
Yes
3 4
AAAA
ABCA
AADA
No
4 4
YYYR
BYBY
BBBY
BBBY
Yes
7 6
AAAAAB
ABBBAB
ABAAAB
ABABBB
ABAAAB
ABBBAB
AAAAAB
Yes
2 13
ABCDEFGHIJKLM
NOPQRSTUVWXYZ
No
备注
在第一个示例中,全部的 'A' 形成了一个环。
在第二个示例中,不存在环。
第三个示例,如上图所示 ('Y' = 黄色, 'B' = 蓝色, 'R' = 红色)。
sol:只是找一个环可以用dfs轻松解决,因为有个数限制,所以多记一个变量表示走到当前这个位置经过了多少个点,如果再次走到另一个已经访问过的位置就可以判断一下(可以假装像前缀和一样)
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
const int dx[]={-,,,},dy[]={,,-,};
int n,m,SX,SY;
char Map[N][N];
bool Arr[N][N];
int Ges[N][N];
inline bool dfs(int x,int y)
{
int i;
Arr[x][y]=;
for(i=;i<;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(xx<||xx>n||yy<||yy>m) continue;
if(Map[xx][yy]==Map[x][y])
{
if(!Ges[xx][yy])
{
Ges[xx][yy]=Ges[x][y]+;
if(dfs(xx,yy)) return true;
Ges[xx][yy]=;
}
else
{
if(Ges[x][y]-Ges[xx][yy]+>=) return true;
}
}
}
return false;
}
int main()
{
int i,j;
R(n); R(m);
for(i=;i<=n;i++)
{
scanf("%s",Map[i]+);
}
for(i=;i<=n;i++)
{
for(j=;j<=m;j++) if(!Arr[i][j])
{
Ges[i][j]=;
if(dfs(i,j)) return *puts("Yes");
}
}
puts("No");
return ;
}
/*
input
3 4
AAAA
ABCA
AAAA
output
Yes input
3 4
AAAA
ABCA
AADA
output
No input
4 4
YYYR
BYBY
BBBY
BBBY
output
Yes input
7 6
AAAAAB
ABBBAB
ABAAAB
ABABBB
ABAAAB
ABBBAB
AAAAAB
output
Yes input
2 13
ABCDEFGHIJKLM
NOPQRSTUVWXYZ
output
No
*/
codeforces510B的更多相关文章
- Codeforces510B【dfs】
判断一个图里是否有一个自环: 50*50 标记起点,然后暴搜? #include <bits/stdc++.h> #include<algorithm> using names ...
随机推荐
- python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建)
昨日内容回顾 队列 队列 : 先进先出.数据进程安全 队列实现方式: 管道 + 锁 生产者消费者模型 : 解决数据供需不平衡 管道 双向通信 数据进程不安全 EOFError: 管道是由操作系统进行引 ...
- ASP.NET ActiveMQ 消息队列
1.引入 2.发送消息 3.接收消息 概述:MQ消息存放在内存,重启后,消息丢失.接收后,消息丢失(只取一次),不取,一直在且速度快. 使用前:下载apache-activemq-5.15.2-bin ...
- Omi框架学习之旅 - 通过omi-id来实现组件通讯 及原理说明
这个demo是通过omi-id来获取子类的实例,然后更改data属性,之后updata一下就好了. 老规矩:先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. class Hello ...
- BZOJ2154/BZOJ2693/Luogu1829 Crash的数字表格/JZPFAR 莫比乌斯反演
传送门--Luogu 传送门--BZOJ2154 BZOJ2693是权限题 其中JZPFAR是多组询问,Crash的数字表格是单组询问 先推式子(默认\(N \leq M\),所有分数下取整) \(\ ...
- Luogu3067 平衡的奶牛群 Meet in the middle
题意:给出$N$个范围在$[1,10^8]$内的整数,问有多少种取数方案使得取出来的数能够分成两个和相等的集合.$N \leq 20$ 发现爆搜是$O(3^N)$的,所以考虑双向搜索. 先把前$3^\ ...
- (转) Ubuntu 更改文件夹及子文件夹权限
Linux系统下如何修改文档及文件夹(含子文件夹)权限,我们来看一下. 一 介绍: 可以使用命令chmod来为文件或目录赋予权限.Linux/Unix 的档案存取权限分为三级 : 档案拥有者.群组.其 ...
- 微信小程序 wx.getUserInfo 解密 C# 代码 - 转
public static string DecodeUserInfo(string raw, string signature,string encryptedData, string iv) { ...
- NOI Day1线上同步赛梦游记
Preface 第一次体验NOI,虽然不是正式选手,但是打打同步赛还是挺涨姿势的,也算是体验了一把. Day1很爆炸,一方面是NOI题目的难度高于自身的水平,另一方面也出现了比较大的失误,T1一个数组 ...
- [译]Kubernetes 分布式应用部署和人脸识别 app 实例
原文地址:KUBERNETES DISTRIBUTED APPLICATION DEPLOYMENT WITH SAMPLE FACE RECOGNITION APP 原文作者:skarlso 译文出 ...
- java内存溢出的解决思路
原文地址:https://www.cnblogs.com/200911/p/3965108.html 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能 ...