CF Fox And Two Dots (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 读错题了,一直以为是要找矩形,比赛快结束才被队友提醒。
DFS一下就可以,每个点记录一下它是从起点出发的第几个点,如果搜索的过程中遇到了走过的点,那么判断一下这两个点的差是否大于等于3,如果满足就说明形成了一个环。本来想的是,如果从某个点出发没找到,那么就说明和这个点连通的所有点都不可行,于是加入了一个剪枝,将这一连通分量减掉,但是似乎没什么作用,加和不加都是15ms,网上还有一种更炫的写法,就是把起点放在当前点的屁股后面,如果遇到了走过的点就找到,我有空试试,写出来的话就更新上来。 --------------------------------------------------------------------------------------------------------- 深夜补发,刚才说的那个算法写了下,实际效果没想象的那么好,还没有我之前写的那个快,不过仔细想想,复杂度貌似是一样的。 不加剪枝:
#include <bits/stdc++.h>
using namespace std; const int UPDATE[][] = {{,},{,-},{,},{-,}};
char MAP[][];
int N,M;
struct Node
{
bool vis = ;
int n = ;
}VIS[][]; bool dfs(int,int,int,char);
int main(void)
{
cin >> N >> M; for(int i = ;i <= N;i ++)
cin >> MAP[i] + ;
for(int i = ;i <= N;i ++)
for(int j = ;j <= M;j ++)
{
VIS[i][j].vis = VIS[i][j].n = ;
if(dfs(i,j,,MAP[i][j]))
{
puts("Yes");
return ;
}
VIS[i][j].vis = VIS[i][j].n = ;
}
puts("No"); return ;
} bool dfs(int x,int y,int sum,char color)
{
for(int i = ;i < ;i ++)
{
int new_x = x + UPDATE[i][];
int new_y = y + UPDATE[i][];
if(new_x > N || new_x < || new_y > M || new_y < ||
MAP[new_x][new_y] != color)
continue; if(VIS[new_x][new_y].vis && sum - VIS[new_x][new_y].n + >= )
return true;
if(VIS[new_x][new_y].vis)
continue; VIS[new_x][new_y].vis = true;
VIS[new_x][new_y].n = sum + ;
if(dfs(new_x,new_y,sum + ,color))
return true;
VIS[new_x][new_y].vis = false;
VIS[new_x][new_y].n = sum;
} return false;
}
加了剪枝:
#include <bits/stdc++.h>
using namespace std; const int UPDATE[][] = {{,},{,-},{,},{-,}};
char MAP[][];
int N,M;
struct Node
{
bool vis = ;
int n = ;
}VIS[][]; bool dfs(int,int,int,char);
void cut(int,int,char);
int main(void)
{
cin >> N >> M; for(int i = ;i <= N;i ++)
cin >> MAP[i] + ;
for(int i = ;i <= N;i ++)
for(int j = ;j <= M;j ++)
{
if(MAP[i][j] == '.')
continue;
VIS[i][j].vis = VIS[i][j].n = ;
if(dfs(i,j,,MAP[i][j]))
{
puts("Yes");
return ;
}
VIS[i][j].vis = VIS[i][j].n = ;
cut(i,j,MAP[i][j]);
}
puts("No"); return ;
} bool dfs(int x,int y,int sum,char color)
{
for(int i = ;i < ;i ++)
{
int new_x = x + UPDATE[i][];
int new_y = y + UPDATE[i][];
if(new_x > N || new_x < || new_y > M || new_y < ||
MAP[new_x][new_y] != color)
continue; if(VIS[new_x][new_y].vis && sum - VIS[new_x][new_y].n + >= )
return true;
if(VIS[new_x][new_y].vis)
continue; VIS[new_x][new_y].vis = true;
VIS[new_x][new_y].n = sum + ;
if(dfs(new_x,new_y,sum + ,color))
return true;
VIS[new_x][new_y].vis = false;
VIS[new_x][new_y].n = sum;
} return false;
} void cut(int x,int y,char cor)
{
for(int i = ;i < ;i ++)
{
int new_x = x + UPDATE[i][];
int new_y = y + UPDATE[i][];
if(new_x > N || new_x < || new_y > M || new_y < ||
MAP[new_x][new_y] != cor || VIS[new_x][new_y].vis)
continue;
MAP[new_x][new_y] = '.';
cut(new_x,new_y,cor);
}
}
网上的算法:
#include <bits/stdc++.h>
using namespace std; const int UPDATE[][] = {{,},{,-},{,},{-,}};
int N,M;
char MAP[][];
bool VIS[][];
int BACK_X,BACK_Y; bool dfs(int i,int j,char color);
int main(void)
{
cin >> N >> M;
for(int i = ;i <= N;i ++)
cin >> MAP[i] + ;
for(int i = ;i <= N;i ++)
for(int j = ;j <= M;j ++)
{
VIS[i][j] = ;
if(dfs(i,j,MAP[i][j]))
{
puts("Yes");
return ;
}
VIS[i][j] = ;
}
puts("No"); return ;
} bool dfs(int i,int j,char color)
{
int back_x = BACK_X;
int back_y = BACK_Y;
for(int k = ;k < ;k ++)
{
int next_x = i + UPDATE[k][];
int next_y = j + UPDATE[k][]; if(next_x > N || next_x < || next_y > M || next_y < ||
MAP[next_x][next_y] != color)
continue;
if(VIS[next_x][next_y] && next_x != BACK_X && next_y != BACK_Y)
{
return true;
}
if(VIS[next_x][next_y])
continue; BACK_X = i;
BACK_Y = j;
VIS[next_x][next_y] = ;
if(dfs(next_x,next_y,color))
return true;
VIS[next_x][next_y] = ;
BACK_X = back_x;
BACK_Y = back_y;
} return false;
}
CF Fox And Two Dots (DFS)的更多相关文章
- 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 ...
- D - Fox And Two Dots DFS
Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on ...
- CodeForces - 510B Fox And Two Dots (bfs或dfs)
B. Fox And Two Dots time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 17-比赛2 F - Fox And Two Dots (dfs)
Fox And Two Dots CodeForces - 510B ================================================================= ...
- B. Fox And Two Dots
B. Fox And Two Dots time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Fox And Two Dots
B - Fox And Two Dots Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...
- CF510B Fox And Two Dots(搜索图形环)
B. Fox And Two Dots time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- CF 510b Fox And Two Dots
Fox Ciel is playing a mobile puzzle game called "Two Dots". The basic levels are played on ...
- Codeforces 510B Fox And Two Dots 【DFS】
好久好久,都没有写过搜索了,看了下最近在CF上有一道DFS水题 = = 数据量很小,爆搜一下也可以过 额外注意的就是防止往回搜索需要做一个判断. Source code: //#pragma comm ...
随机推荐
- C语言break语句
break语句不能用于循环语句和switch语句之外的任何其他语句中: breakh中断switch break如果用于循环,是用来终止循环:break如果用于switch,则是用于终止switch. ...
- ActiveX控件是什么?
一.ActiveX的由来 ActiveX最初只不过是一个商标名称而已,它所涵盖的技术并不是各自孤立的,其中多数都与Internet和Web有一定的关联.更重要的是,ActiveX的整体技术是由Micr ...
- JavaIO(04)字符流--Writer and Reader
字符流: 常识:在java中一个字符等于两个字节: 操作字符流的两个类:Writer,Reader API文档介绍(Writer): public abstract class Write ...
- poj 1466 Girls and Boys(二分图的最大独立集)
http://poj.org/problem?id=1466 Girls and Boys Time Limit: 5000MS Memory Limit: 10000K Total Submis ...
- uva 796 Critical Links(无向图求桥)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- quartz源码解析(一)
本文的起因源于一次quartz的异常,在win2003正常运行的程序放在linux环境就抛出异常了,虽然找出异常没花我多长时间,不过由此加深了对quzrtz的了解:古人说,三折肱,为良医,说明经验对于 ...
- python登录csdn并自动评论下载资源脚本
功能 1.自动登录csdn 2.查找未评论的资源并自动评论 用到的库 1.python自带的requests,获取以及发送网页数据 2.python自带的time,用作休眠,csdn资源一段时间内只允 ...
- 基于 Paramiko 的 SSH 通讯类
# -*- coding: UTF-8 -*-import paramikoimport time################################################### ...
- ie6的兼容问题及解决方案
1.png24位的图片在ie6浏览器上会出现背景,解决方案是做成png8位: 2.浏览器默认的margin和padding不同,解决方法是用全局重置来统一,即是*{margin:0;padding:0 ...
- Sonatype Nexus 搭建Maven 私服
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...