http://codeforces.com/contest/510/status/B

题目大意 给一个n*m  找有没有相同字母连起来的矩形串

第一种并查集 瞎搞一下

第一次的时候把val开成字符串了 所以wa

改了AC

#include<cstdio>
#include<map>
//#include<bits/stdc++.h>
#include<vector>
#include<stack>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<queue>
#include<cstdlib>
#include<climits>
#define PI acos(-1.0)
#define INF 0x3fffffff
using namespace std;
typedef long long ll;
typedef __int64 int64;
const ll mood=1e9+;
const int64 Mod=;
const double eps=1e-;
const int N=;
const int MAXN=1e4+;
typedef int rl;
inline void r(rl&num){
num=;rl f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
num*=f;
}
char ch[N][N];
int val[N][N];
int par[MAXN],sum[MAXN];
int n,m;
char tem;
int dx[]={,},dy[]={,};
void init()
{
int s=;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{ val[i][j]=s;//cout<<val[i][j]<<endl;
par[s]=s;
sum[s]=;
s++;
}
}
}
int find(int x)
{
if(x==par[x]) return x;
return par[x]=find(par[x]);
}
bool unite(int x,int y)
{
x=find(x);y=find(y);
if(x==y&&sum[x]>=) return true;
if(x==y) return false;
par[x]=y;
sum[y]+=sum[x];
return false;
}
bool check(int x,int y)
{
if(x>=&&x<n&&y<m&&y>=&&ch[x][y]==tem) return true;
else return false;
}
int main()
{
r(n);r(m);
for(int i=;i<n;i++)
{
scanf("%s",ch[i]);
}
init();
bool mk=false;
for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
tem=ch[i][j];
for(int k=;k<;k++)
{
int x=dx[k]+i,y=dy[k]+j;
if(check(x,y))
{
if(unite(val[i][j],val[x][y]))
{
mk=true;
break;
}
}
}
if(mk) break;
}
if(mk) break;
}
if(mk) puts("Yes");
else puts("No");
return ;
}
/*
50 50
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY
*/

并查集

这个类似联通块 dfs做 首尾相交就输出YES 做一下

#include<cstdio>
char ch[][];
int vis[][];
int flag;
int n,m;
int dx[]={,,-,},dy[]={,-,,};
void dfs(int atx,int aty,int x,int y,char z)
{
if(vis[x][y])
{
flag=;
return ;
}
vis[x][y]=;
int nx,ny;
for(int i=;i<;i++)
{
nx=x+dx[i];ny=y+dy[i];
if(nx<||nx>=n||ny<||ny>=m||z!=ch[nx][ny]||(atx==nx&&ny==aty)) continue;
dfs(x,y,nx,ny,z);
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
scanf("%s",ch[i]);
}
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if(!vis[i][j])
{
dfs(-,-,i,j,ch[i][j]);
}
if(flag){printf("Yes\n");return ;}
}
printf("No\n");
return ;
}

其实dfs做的很不顺利

还有一个方法 构成矩形块的充要条件 自己的上下左右要有和自己相同的块至少两个 小于两个的块必然不是 可以标记扔掉

这里感叹下高手对细节的处理真的好强 等自己写的时候才知道问题在哪里 仔细看下人家的才恍然大悟 这样才不会越界

就是在n*m的周围搞上一圈空

大致意思就是把不符合的点全部标记并回到1,2点并不是回到起点 1,1点如果满足条件没被标记的话 就会留下1,1点 所以判断ans>1

#include<cstdio>
char ch[][];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
getchar();
for(int j=;j<=m;j++)
{
ch[i][j]=getchar();
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(ch[i][j]!='%')
{
int tem=;
if(ch[i][j]==ch[i-][j]) tem++;
if(ch[i][j]==ch[i+][j]) tem++;
if(ch[i][j]==ch[i][j-]) tem++;
if(ch[i][j]==ch[i][j+]) tem++;
if(tem<) {ch[i][j]='%';i=j=;} //回到起点
}
}
int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(ch[i][j]!='%') ans++;
if(ans>)
{
puts("Yes");
return ;
}
}
puts("No");
return ;
}

神奇的姿势

现在搞一下回到起点的 只要判断有点留下 那么就输出Yes;

#include<cstdio>
char ch[][];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
getchar();
for(int j=;j<=m;j++)
{
ch[i][j]=getchar();
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(ch[i][j]!='%')
{
int tem=;
if(ch[i][j]==ch[i-][j]) tem++;
if(ch[i][j]==ch[i+][j]) tem++;
if(ch[i][j]==ch[i][j-]) tem++;
if(ch[i][j]==ch[i][j+]) tem++;
if(tem<) {ch[i][j]='%';i=;j=;} }
}
int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(ch[i][j]!='%')
{
puts("Yes");
return ;
}
}
puts("No");
return ;
}

理解版神奇的姿势

Codeforces Round #290 (Div. 2) _B找矩形环的三种写法的更多相关文章

  1. 找规律 Codeforces Round #290 (Div. 2) A. Fox And Snake

    题目传送门 /* 水题 找规律输出 */ #include <cstdio> #include <iostream> #include <cstring> #inc ...

  2. Codeforces Round #290 (Div. 2) E. Fox And Dinner 网络流建模

    E. Fox And Dinner time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  3. Codeforces Round #290 (Div. 2) D. Fox And Jumping dp

    D. Fox And Jumping 题目连接: http://codeforces.com/contest/510/problem/D Description Fox Ciel is playing ...

  4. Codeforces Round #290 (Div. 2) C. Fox And Names dfs

    C. Fox And Names 题目连接: http://codeforces.com/contest/510/problem/C Description Fox Ciel is going to ...

  5. Codeforces Round #290 (Div. 2) B. Fox And Two Dots dfs

    B. Fox And Two Dots 题目连接: http://codeforces.com/contest/510/problem/B Description Fox Ciel is playin ...

  6. Codeforces Round #290 (Div. 2) A. Fox And Snake 水题

    A. Fox And Snake 题目连接: http://codeforces.com/contest/510/problem/A Description Fox Ciel starts to le ...

  7. Codeforces Round #242 (Div. 2)C(找规律,异或运算)

    一看就是找规律的题.只要熟悉异或的性质,可以秒杀. 为了防止忘记异或的规则,可以把异或理解为半加运算:其运算法则相当于不带进位的二进制加法. 一些性质如下: 交换律: 结合律: 恒等律: 归零律: 典 ...

  8. Codeforces Round #347 (Div.2)_B. Rebus

    题目链接:http://codeforces.com/contest/664/problem/B B. Rebus time limit per test 1 second memory limit ...

  9. Codeforces Round #290 (Div. 2) B. Fox And Two Dots(DFS)

    http://codeforces.com/problemset/problem/510/B #include "cstdio" #include "cstring&qu ...

随机推荐

  1. c++函数模板1

    1 定义: 函数模板 只适用于参数个数相同但是类型不同 而且函数体相同的情况 2 这个例子没有使用模板的情况 #include <iostream> using namespace std ...

  2. Identity Server 4 原理和实战(完结)_汇总贴

    视频地址:https://www.bilibili.com/video/av42364337 语雀地址:https://www.yuque.com/yuejiangliu/dotnet/solenov ...

  3. 爬虫代码实现四:采用Hbase存储爬虫数据(1)

    3.Hbase表设计: 1.窄表:列少行多,表中的每一行尽可能保持唯一. 2.宽表:列多行少,通过时间戳版本来进行区分取值. 窄表:比如说,这个表,rowkey由userid+时间+bbsid假设bb ...

  4. Android studio 集成 Genymotion

    这学期刚学android,q其内置的模拟器一开起来电脑实在卡的不要不要的了.查了一下可以在studio中集成genymotion模拟器.各方面百度最后总结了几点. 要在studio中集成genymot ...

  5. P4443 [COCI2017-2018#3] Dojave(线段树)

    传送门 设\(lim=2^n-1\),对于一个区间\([l,r]\)来说,如果\(sum\neq lim\)且能换出\(x\)并换进\(y\)来,使得\(sum\bigoplus a_x\bigopl ...

  6. P4091 [HEOI2016/TJOI2016]求和(第二类斯特林数+NTT)

    传送门 首先,因为在\(j>i\)的时候有\(S(i,j)=0\),所以原式可以写成\[Ans=\sum_{i=0}^n\sum_{j=0}^nS(i,j)\times 2^j\times j! ...

  7. java string(转)

    初探Java字符串 优化变成了忧患:String.split引发的“内存泄露” String是java中的无处不在的类,使用也很简单.初学java,就已经有字符串是不可变的盖棺定论,解释通常是:它是f ...

  8. C - Heavy Transportation

    //改版dijkstra #include <iostream> #include <algorithm> #define Faster ios::sync_with_stdi ...

  9. 图像分类丨ILSVRC历届冠军网络「从AlexNet到SENet」

    前言 深度卷积网络极大地推进深度学习各领域的发展,ILSVRC作为最具影响力的竞赛功不可没,促使了许多经典工作.我梳理了ILSVRC分类任务的各届冠军和亚军网络,简单介绍了它们的核心思想.网络架构及其 ...

  10. sgu316Kalevich Strikes Back(线段树+扫描线)

    做法:总体想法是求出一个矩形的面积以及它所包含的矩形,然后用自己的面积减掉所包含的.主要问题是怎样求解它所包含的矩形. 因为是没有相交点的,可以利用扫描线的方法去做,类似染色,当前段如果是x色,也就是 ...