codeforces510B

Posted gaojunonly1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces510B相关的知识,希望对你有一定的参考价值。

Fox And Two Dots

 CodeForces - 510B 

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

技术图片
技术图片

每个单元格包含了一个具有某种颜色的点。我们将使用不同的大写拉丁字符,表示不同的颜色。

这个游戏的关键是,找到同色环。例如,考虑图上的 4 个蓝色点,它们形成了一个环。正式地,我们将一个点序列 d1, d2, ..., dk 称作一个环 ,当且仅当它满足以下的条件:

  1. 这 k 个点不同:如果 i ≠ j 那么 di 与 dj 不同。
  2. k 至少是 4。
  3. 全部的点属于同一种颜色。
  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=0;
    bool f=0;
    char ch= ;
    while(!isdigit(ch))
    {
        f|=(ch==-); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar(-); x=-x;
    }
    if(x<10)
    {
        putchar(x+0); return;
    }
    write(x/10);
    putchar((x%10)+0);
    return;
}
#define W(x) write(x),putchar(‘ ‘)
#define Wl(x) write(x),putchar(‘\n‘)
const int N=55;
const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
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]=1;
    for(i=0;i<4;i++)
    {
        int xx=x+dx[i],yy=y+dy[i];
        if(xx<1||xx>n||yy<1||yy>m) continue;
        if(Map[xx][yy]==Map[x][y])
        {
            if(!Ges[xx][yy])
            {
                Ges[xx][yy]=Ges[x][y]+1;
                if(dfs(xx,yy)) return true;
                Ges[xx][yy]=0;
            }
            else
            {
                if(Ges[x][y]-Ges[xx][yy]+1>=4) return true;
            }
        }
    }
    return false;
}
int main()
{
    int i,j;
    R(n); R(m);
    for(i=1;i<=n;i++)
    {
        scanf("%s",Map[i]+1);
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++) if(!Arr[i][j])
        {
            Ges[i][j]=1;
            if(dfs(i,j)) return 0*puts("Yes");
        }
    }
    puts("No");
    return 0;
}
/*
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
*/
View Code

 

以上是关于codeforces510B的主要内容,如果未能解决你的问题,请参考以下文章

[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段

c_cpp Codeforces片段

Codeforces 86C Genetic engineering(AC自动机+DP)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)

(Incomplete) Codeforces 394 (Div 2 only)

CodeForces 931F Teodor is not a liar!