CodeForces - 510B Fox And Two Dots (bfs或dfs)
2 seconds
256 megabytes
standard input
standard output
Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on a board of size n × m cells, like this:

Each cell contains a dot that has some color. We will use different uppercase Latin characters to express different colors.
The key of this game is to find a cycle that contain dots of same color. Consider 4 blue dots on the picture forming a circle as an example. Formally, we call a sequence of dots d1, d2, ..., dk a cycle if and only if it meets the following condition:
- These k dots are different: if i ≠ j then di is different from dj.
- k is at least 4.
- All dots belong to the same color.
- For all 1 ≤ i ≤ k - 1: di and di + 1 are adjacent. Also, dk and d1 should also be adjacent. Cells x and y are called adjacent if they share an edge.
Determine if there exists a cycle on the field.
The first line contains two integers n and m (2 ≤ n, m ≤ 50): the number of rows and columns of the board.
Then n lines follow, each line contains a string consisting of m characters, expressing colors of dots in each line. Each character is an uppercase Latin letter.
Output "Yes" if there exists a cycle, and "No" otherwise.
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
In first sample test all 'A' form a cycle.
In second sample there is no such cycle.
The third sample is displayed on the picture above ('Y' = Yellow, 'B' = Blue, 'R' = Red).
题意:找同一种颜色的环
这题麻烦的地方在于走过的路被标记了,那怎么判断有环呢?
其实记录步数就可以了,bfs和dfs道理是一样的
bfs做法:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct node
{
int x,y;
};
bool v[][];
int book[][];
char a[][];
int d[][]={{-,},{,},{,-},{,}};
queue<node>q;
int main()
{
int n,m;
cin>>n>>m;
memset(v,,sizeof(v));
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
cin>>a[i][j];
}
}
bool f=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!v[i][j])
{ memset(book,,sizeof(book));
v[i][j]=;
while(!q.empty()) q.pop();
node b;
b.x=i;
b.y=j;
book[i][j]=;
q.push(b);
while(!q.empty())
{
node b=q.front();
q.pop();
for(int k=;k<;k++)
{
int xx=b.x+d[k][];
int yy=b.y+d[k][];
if(xx<||yy<||xx>n||yy>m||a[xx][yy]!=a[i][j]) continue;
v[xx][yy]=;
node c;
c.x=xx;
c.y=yy;
if(book[xx][yy]>=book[b.x][b.y])//如果当前走过去格子有步数且的步数比当前这个格子还要大,说明已经走过了,形成了环。
{ f=;break;
}
if(book[xx][yy])continue;
q.push(c);
book[xx][yy]=book[b.x][b.y]+;//保存路的步数
}
if(f) break;
}
if(f) break;
}
if(f) break;
}
if(f) break;
}
if(f) cout<<"Yes";
else cout<<"No";
return ; }
dfs也是同样道理:
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
char a[][];
bool book[][];
int v[][];
int z[];
int n,m;
int d[][]={{-,},{,},{,},{,-}};
bool f=;
int si,sj;
void dfs(char c,int x,int y)
{ for(int i=;i<;i++)
{
int xx=x+d[i][];
int yy=y+d[i][];
if(xx<||yy<||xx>n||yy>m) continue;
if(v[xx][yy]!=&&v[x][y]-v[xx][yy]>)//走过去的格子已经有值了且比现在走的格子还大不止1,大1可能是之前走过来的
{
f=;
return;
}
if(a[xx][yy]==c&&v[xx][yy]==)
{
v[xx][yy]=v[x][y]+;
book[xx][yy]=;
dfs(c,xx,yy);
if(f) return;
v[xx][yy]=; }
}
} int main()
{
scanf("%d %d",&n,&m);
memset(z,,sizeof(z));
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!book[i][j])
{
z[a[i][j]-'A']=;
memset(v,,sizeof(v));
book[i][j]=;
si=i;
sj=j;
v[i][j]=;
dfs(a[i][j],i,j);
if(f) break;
}
}
if(f) break;
}
if(f) cout<<"Yes";
else cout<<"No";
return ;
}
CodeForces - 510B Fox And Two Dots (bfs或dfs)的更多相关文章
- codeforces 510B. Fox And Two Dots 解题报告
题目链接:http://codeforces.com/problemset/problem/510/B 题目意思:给出 n 行 m 列只有大写字母组成的字符串.问具有相同字母的能否组成一个环. 很容易 ...
- Codeforces 510B Fox And Two Dots 【DFS】
好久好久,都没有写过搜索了,看了下最近在CF上有一道DFS水题 = = 数据量很小,爆搜一下也可以过 额外注意的就是防止往回搜索需要做一个判断. Source code: //#pragma comm ...
- CF 510b Fox And Two Dots
Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on ...
- 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 ...
- 17-比赛2 F - Fox And Two Dots (dfs)
Fox And Two Dots CodeForces - 510B ================================================================= ...
- Fox And Two Dots
B - Fox And Two Dots Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...
- B. Fox And Two Dots
B. Fox And Two Dots time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- CF Fox And Two Dots (DFS)
Fox And Two Dots time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- CF510B Fox And Two Dots(搜索图形环)
B. Fox And Two Dots time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- 深入理解Node.js中的垃圾回收和内存泄漏的捕获
深入理解Node.js中的垃圾回收和内存泄漏的捕获 文章来自:http://wwsun.github.io/posts/understanding-nodejs-gc.html Jan 5, 2016 ...
- SG函数略解
由于笔者太懒,懒得把原来的markdown改成MCE,所以有很多奇怪的地方请谅解. 先说nim游戏. 大意:有n堆石子,两个人轮流取,每个人每次从任意一堆取任意个,直到一个人无法取了为止.问对于石子的 ...
- mongodb,redis简单学习
2.mongodb安装配置简单学习 配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作 ...
- 导入Jquery.min.js时 JQuery 上打红X了
问题解决:右击jquery.min.js——>MyEclipse——>点击Exclude From Validation——>点击Run Validation 即可
- 【jsoi】第一季 [略]精简题解
UPD:好像有两道题的代码逃跑了?= =就先不找了,反正都是水题. 精简题解系列第四弹.(其实也不是那么精简啊= =) [JSOI2008]最大数maxnumber 单点修改,区间最大值查询,裸线段树 ...
- JavaScript -- 练习,Dom 获取节点
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- R语言常用语法总结
## 1. 数据输入 ##a$b # 数据框中的变量a = 15 # 赋值a <- 15 # 赋值a = c(1,2,3,4,5) # 数组(向量)b = a[1] # 数组下标,从1开始b = ...
- WPF绑定数据源之RelativeSource
Command="{Binding ConfirmRegisterCommand}" CommandParameter="{Binding RelativeSource= ...
- Python基本语法(一)
注释及注意 #代表注释:冒号:结尾时,接下来的代码会自动缩进,一般为4个空格.Python程序是大小写敏感的. 数据类型和变量 在Python中能够直接处理的数据类型有以下几种: 整数 浮点数 字符串 ...
- WP追加字符串到文件
#if DEBUG const string logfile = "demo.log"; try { using (var sw = new System.IO.StreamWri ...